动态 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
我是初学者 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'
这里我提到了一小部分真实场景。在实际情况下,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