将参数传递给命令文本包含IN的命名命令

本文关键字:命令 IN 文本 参数传递 包含 | 更新日期: 2023-09-27 18:17:10

如何为SQL Text包含IN的命令传递参数值?例如,我的命令SQL文本类似于SELECT * FROM USERS WHERE USERID IN (1,2,3)

有很多像MSDN这样的例子,但找不到一个为IN传递值的例子。尝试将变量和设置值作为单个字符串,但SQL不会以这种方式工作

将参数传递给命令文本包含IN的命名命令

您应该有一个UDF,它将(例如)csv字符串转换为值表。然后,你的查询可以是这样的:

select *从yourTablewhere yourField IN (select yourColumn from do . yourudf (yourCSV))

简短的回答是没有好的方法来做到这一点。

如果你确实只是处理一个数值列表,你可能不需要使用参数,因为这个特性主要是为了防止SQL注入攻击。然而,如果你有一个int数组,并使用它来构建你的查询,你是安全的。

我能想到的唯一其他方法是为每个项目添加一个参数。例如:

SELECT * FROM USERS WHERE USERID IN (@p1, @p2, @p3)

然后,在c#中循环遍历数组,并为每个项创建一个参数。

希望这对你有帮助!

这个问题已经问过很多次了。我想到了两种方法:

如果您有SQL2008,您可以传递一个"表值参数"(tvp),其中您的表参数包含"in"子句的值,然后有一个"where"子句检查值是否"in (select whatever from tvp)"。

如果没有SQL2008,可以使用"公共表表达式"(cte),例如…

declare @t table (xyz varchar(100))
insert into @t values ('hello')
insert into @t values ('there')
insert into @t values ('world')
insert into @t values ('10')
insert into @t values ('20')
insert into @t values ('30')
declare @a as varchar(120)
set @a = 'hello,10,30'
;with cte as
(
    select cast(null as varchar(max)) as 'v', 1 as s, charindex(',' , @a, 0) as e
union all
    select cast(substring(@a, s, e-s) as varchar(max)), e+1, charindex(',' , @a + ',', e+1)
    from cte where e!=0
)
select *
from @t
where (xyz in (select v from cte where v is not null))

在这个(上面的)示例中,字符串@a是逗号分隔的值列表,您想要用于"In"子句,而(递归) cte只是一个接一个地去掉这些值。当然,这只是一个简单的例子,可能需要检查空字符串、连续逗号等。

当然,对于使用SQL (有效地)进行字符串操作,通常的警告也适用。

问候,罗斯