日期:2014-05-18  浏览次数:20539 次

SQL 中 IN 参数传入的问题
我这样写SQL没问题:select * from Show2003 where S1 in ('600600','600112');
 
但是我在程序里面(我用的是VC OLEDB,其实其他程序一样的也是这个问题)SQL这样写 select * from show2003 where S1 IN (?) , 也就是用参数。 就这样我调用的时候参数怎么传都得不到结果。试过n种可能性了,都不能成功,比如 "600600","600112" | "'600600'","'600112'" | "'600600','600112'" | | 600600','600112 | "600600'","600112'"
 
看我试过的各种可能就知道我猜测了很多中参数处理的可能。 就是不成功。
 
后来我发现用VS2010连上数据库,用SQLbuilder方式建立 select * from show2003 where S1 IN (?) 这样的查询,执行的时候会弹窗让你输入参数,各种方式试了也还是不行。 如图:
http://img.my.csdn.net/uploads/201206/08/1339136523_6370.jpg

所以这个已经不是程序处理的问题了,要么是不支持IN 参数列表,要么就是输入参数规则不对。
 
请问一下又没人试过这样的情况成功的?
 
注:  
 1. 如果 IN参数中只输入一个项没问题,如 '600600'.  
 2. 参数是varchar(10)的,数值型的不要试了。

------解决方案--------------------
SQL code
declare @v_value varchar(32)
set @v_value ='''600600'',''600112'''
declare @sql varchar(max)
set @sql='select * from Show2003 where S1 in ('+@v_value +')'
print @sql
---select * from Show2003 where S1 in ('600600','600112')

------解决方案--------------------
你传入的参数是一个字符串,建议你这样试试
select * from Show2003 where S1 charindex(S1,?)
------解决方案--------------------
在SQL SERVER 中 两个 '' 代表 一个 '
------解决方案--------------------
这种传递参数的方式,再传递到IN里面去实际上SQL是把整个参数当成一个string类型来处理的,所以不管你怎么写都相当于 IN ('ssssssssss.....'),不管里面什么格式。这种情况想达到效果,要不然拼接SQL执行,要不然用charindex
SQL code

select * from show2003 where CHARINDEX(S1,?) > 0  --传参数就可以了

------解决方案--------------------
直接select * from tb where charindex(S1,?)>0啊,干嘛还需要去拼接?你传过来的参数就是这个问号