in运算符,其中值来自参数

lfapxunr  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(274)

我是一个sql初学者。这可能是一个老帖子,但我没有得到任何简化的解决方案。
我关心的是如何使用 IN 动态sql中的子句,其中 IN 项目基于具有多个值的参数。
我有一个名为employee的表。

我已经编写了一个动态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

此脚本不适用于多个部门,并且不返回任何结果。如果 @Department = 'IT' 这里我已经提到了真实场景的一小部分。在实际情况中,表名是将包含在 IN 运算符都是动态的,将被接受为存储过程参数。
谢谢你的帮助。

erhoui1w

erhoui1w1#

这个查询应该会出错,因为在列表的元素周围缺少单引号。
使用表变量作为参数比使用csv字符串简单得多。
至于处理字符串参数,实际上不需要动态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 + ',%'
enyaitl3

enyaitl32#

我对此不太感兴趣,你必须小心部门名称中有撇号,但一个简单的解决方案可能是:

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

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

PRINT @SQL

相关问题