Передайте переменную SQL в предложение IN через хранимую процедуру - PullRequest
0 голосов
/ 13 сентября 2018

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

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

Что я имею в своем утверждении WHERE, так это:

WHERE V.client IN (@number) 

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Динамический 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?

0 голосов
/ 13 сентября 2018

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

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 ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...