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

时间:2011-12-07 19:40:04

标签: c# sql sql-server

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

有许多例子如MSDN has但是找不到一个传递IN的值。尝试获取变量并将值设置为单个字符串,但SQL不会以这种方式工作。

3 个答案:

答案 0 :(得分:0)

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

如果您确实只使用数值列表,则可能不需要使用参数,因为此功能主要用于防止SQL注入攻击。但是,如果您有int的数组,并使用它来构建查询,那么您就是安全的。

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

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

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

希望这有帮助!

答案 1 :(得分:0)

这已被问过很多次了。想到两种方式:

如果你有SQL2008,你可以传递一个“table value parameter(tvp),其中你的table参数有你的“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来(有效地)进行字符串操作,通常需要注意。

此致 罗斯

答案 2 :(得分:0)

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

选择* 来自你的表格 其中yourField IN(从dbo.yourUDF(yourCSV)中选择你的列)