动态 SQL 中的 IN 运算符,其中值来自参数

IN Operator in Dynamic SQL where Values are from Parameter

我是初学者 SQL.This 可能是老手 post 但我没有得到任何简化的解决方案。

我关心的是如何在动态 SQL 中使用 IN 子句,其中 IN 项基于具有多个值的参数。

我有一个名为 Employee 的 table。

我写了一个动态 SQL,它将 return 员工列表 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

此脚本不适用于多个部门,return没有结果。如果 @Department = 'IT'

,相同的查询是 returning 结果

这里我提到了一小部分真实场景。在实际情况下,table 名称,将包含在 IN 运算符中的列名称都是动态的,并将被接受为存储过程参数。

感谢您的帮助。

此查询应该出错,因为您缺少将列表元素括起来的单引号。

使用 table variable 作为参数而不是 CSV 字符串也会简单得多。

至于处理字符串参数,您实际上并不需要动态 SQL。如果你是 运行 SQL Server 2016 或更高版本,你可以使用 table-valued function 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 + ',%'

我对此不是很热衷,您必须注意部门名称中的撇号,但一个简单的解决方案可能是:

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

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

PRINT @SQL