如何传递SQL文本包含IN的命令的参数值。 即我的命令SQL文本类似于SELECT * FROM USERS WHERE USERID IN (1,2,3)
。将参数传递给命令文本包含的命名命令IN
有很多例子,如MSDN has,但coudn't找到一个传递值的IN。试图采取一个变量并将值设置为单个字符串,但SQL不会以这种方式工作。
如何传递SQL文本包含IN的命令的参数值。 即我的命令SQL文本类似于SELECT * FROM USERS WHERE USERID IN (1,2,3)
。将参数传递给命令文本包含的命名命令IN
有很多例子,如MSDN has,但coudn't找到一个传递值的IN。试图采取一个变量并将值设置为单个字符串,但SQL不会以这种方式工作。
你应该有一个UDF其中(例如)CSV字符串转换为数值表。 然后,你的查询可以像一些事情:
SELECT * FROM yourTable 其中yourField IN
是的。这个选项总是在那里。我只是想知道是否有任何我可以省略这个练习,因为我不想修改即将到来的SQL,除了传递参数和系统替换它们的值。 – Cannon
简短的答案是没有好办法做到这一点。
如果您确实只使用数值列表,您可能不需要使用参数,因为此功能主要用于防止SQL注入攻击。但是,如果您有一组int
s,并使用它来构建查询,那么您很安全。
我能想到的唯一方法是为每个项目添加一个参数。例如:
SELECT * FROM USERS WHERE USERID IN (@p1, @p2, @p3)
然后,循环访问C#中的数组,并为每个项目创建一个参数。
希望这会有所帮助!
这已被问了很多很多次。两种方法映入脑海:
如果你有SQL2008,你可以通过一个“table value parameter” (TVP),你的表参数有“在”条款为您的值,然后有一个“其中”子句检查值是“(从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对(有效)做字符串操作。
问候, 罗斯
的可能重复(从dbo.yourUDF(yourCSV)选择yourColumn)([参数化IN子句的SQL?] http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause) –
你的意思是传递值在一个PreparedStatement或什么?! – amrfaissal