Оператор IN в Dynami c SQL, где значения взяты из параметра - PullRequest
0 голосов
/ 20 июня 2020

Я новичок в SQL. Это может быть старый пост, но я не получил для него упрощенного решения.

Меня беспокоит, как использовать предложение IN в динамическом c SQL, где элементы IN основаны на параметрах, имеющих несколько значений.

У меня есть таблица с именем Employee.

введите описание изображения здесь

Я написал динамический c SQL, который вернет списки сотрудников, где Department = 'IT,System'

SQL:

Declare @Department varchar(50)
Declare @SQL nvarchar(MAX)
Declare @Parameters nvarchar(50)

Set @Department='IT,System'
SET @SQL = 'select * from Employee where Department IN(@PDepartment)'     
SET @Parameters=N'@PDepartment nvarchar(50)'

--PRINT @SQL    
EXEC sp_Executesql @SQL,@Parameters,@PDepartment=@Department

Этот сценарий не работает более чем для одного отдела и не возвращает результата. Тот же запрос возвращает результат if @Department = 'IT'

Здесь я упомянул небольшую часть реального сценария. В фактическом случае имя таблицы и имя столбца, которое будет включено в оператор IN, являются динамическими c и будут приняты как сохраненный параметр pro c.

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Этот запрос должен привести к ошибке, поскольку элементы списка отсутствуют в одинарных кавычках.

Также было бы намного проще использовать табличную переменную в качестве аргумента, а не Строка CSV.

Что касается строкового параметра, вам на самом деле не нужен динамический c SQL для этого. Если вы используете SQL Server 2016 или выше, вы можете использовать возвращающую табличное значение функцию string_split():

select e.*
from employee e
where exists (
    select 1 from string_split(@Department, ',') where value = e.department
)

В более ранних версиях вы можете использовать like:

select e.*
from employee e
where ',' + @Department + ',' like '%,' + e.department + ',%'
0 голосов
/ 20 июня 2020

Я не очень-то энтузиазм c по этому поводу, и вам следует остерегаться наличия апострофов в названиях отделов, но простое решение может быть таким:

Declare @Department varchar(50)
Declare @SQL nvarchar(MAX)

Set @Department='IT,System'
SET @SQL = 'select * from Employee where Department IN (''' + replace(@Department, ',', ''', ''') + ''')'

PRINT @SQL
...