Передайте переменную sql в предложение in через хранимую процедуру.

Моя переменная выглядит так:

DECLARE @number AS NVARCHAR(1000)
SET @number = '1,2,3,4,5,6'

То, что у меня есть в моем заявлении WHERE, таково:

WHERE V.client IN (@number) 

Мой столбец V.Client - целое число. Я пытаюсь удалить '' из числа @ и сделать его похожим на 1,2,3,4,5,6. Я пытался это сделать,

',' + @number + ',' LIKE '%,' + CAST(V.client AS VARCHAR) + ',%'

но он возвращает результаты только для 1, а не для других чисел.

Есть ли у кого-нибудь идеи относительно того, что я могу сделать?

Один из вариантов - передать параметр с табличным значением. Или используйте динамический sql.

Sean Lange 13.09.2018 18:11

Используйте функцию «splitter ()», чтобы превратить строковый параметр в соединение добавления таблицы против этого. Здесь есть несколько функций сплиттера.

Brian 13.09.2018 18:15

Возможный дубликат Параметризация предложения SQL IN

HABO 13.09.2018 20:02

Не используйте в SQL строки с разделителями. Просто не надо. Есть и другие способы получше. Использование параметра с табличным значением или параметра xml, вероятно, являются лучшими вариантами, в другом случае будет использоваться функция разделения строк, манипуляции со строками, подобные тем, которые вы пробовали, и динамический sql также являются вариантами, хотя, вероятно, худшими.

Zohar Peled 13.09.2018 21:04
0
4
1 418
2

Ответы 2

Другой вариант

DECLARE @number AS nvarchar(1000)
SET @number = '1,2,3,4,5,6'

...
WHERE V.client IN (
                    Select RetVal = B.i.value('(./text())[1]', 'int')
                    From  (Select x = Cast('<x>' + replace(@Number,',','</x><x>')+'</x>' as xml).query('.')) as A 
                    Cross Apply x.nodes('x') AS B(i)
                  )

Если 2016+, используйте string_split ()

Динамический sql - самый распространенный вариант, вот фрагмент, как его использовать

DECLARE @number AS nvarchar(1000)
SET @number = N'1,2,3,4,5,6'

declare @cmd nvarchar(1000) = N'select case when 1 in ' + Quotename(@number, '()') + ' then 1 else 0 end'

exec sp_executesql @cmd

который подготовит следующий запрос

select case when 1 in (1,2,3,4,5,6) then 1 else 0 end

Другие варианты, которые вы можете рассмотреть: Разделите строку и используйте стандартные запросы sql. В новом сервере sql есть функция string_split, которая делает именно то, что вы хотите https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017. В более старых версиях вы можете создавать собственные функции, делая то же самое Как разбить строку, чтобы получить доступ к элементу x?

Другие вопросы по теме