繁体   English   中英

将参数传递到命名命令,其中命令文本包含IN

[英]Passing Parameters to a Named Command where command text contains IN

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

有很多像MSDN这样的示例,但找不到通过IN传递值的示例。 尝试将变量和值设置为单个字符串,但是SQL不能那样工作。

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

如果确实只使用一个数值列表,则可能不需要使用参数,因为此功能主要是为了防止SQL注入攻击而设计的。 但是,如果您有一个int数组,并使用该数组构建查询,则很安全。

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

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

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

希望这可以帮助!

这已经被问过很多遍了。 想到两种方法:

如果您有SQL2008,则可以传递一个“ 表值参数(tvp) ,其中表参数具有“ in”子句的值,然后有一个“ where”子句检查值是否为“ in”(从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 (有效)进行字符串操作。

问候,罗斯

您应该具有一个UDF,该UDF可以将(例如)csv字符串转换为值表。 然后,您的查询可能类似于:

从yourTable中选择*,其中yourField输入(从dbo.yourUDF(yourCSV)中选择yourColumn)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM