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

非身经百战的高手不能解决的小问题--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 (?) 这样的查询,执行的时候会弹窗让你输入参数,各种方式试了也还是不行。

所以这个已经不是程序处理的问题了,要么是不支持IN 参数列表,要么就是输入参数规则不对。


请问一下又没人试过这样的情况成功的?

注: 
1. 如果 IN参数中只输入一个项没问题,如 '600600'. 
2. 参数是varchar(10)的,数值型的不要试了。


------解决方案--------------------
是 Sql server 吗,它不直接支持数组参数,这样确实麻烦,可以看看这个
SQL SERVER “数组参数”
------解决方案--------------------
我不会,楼主您别骂我
------解决方案--------------------
无解?!
明白LZ的意思,所以特地用SQL跟踪了,发现SQL服务器在执行带参数的T-SQL语句时用的是执行储存过程sp_executesql,而且针对varchar的参数,在参数头尾判断单引号,参数中遇到单引号(')时使用了双单引号(不是双引号)替换来防止语句错误。
楼主用的工具应该是封装过执行语句的吧。MSSQL中的参数应该是@开头,不是用?代替吧?
顺便Mark下 看有没有高手能绕过SQL的引号替换法则来实现LZ的功能!!!!
------解决方案--------------------
总的来说骂人是不对的,我们程序员都是高素质人群嘛。哈哈。因该像色情网站里的会员那么有素质才对嘛。
------解决方案--------------------
探讨
总的来说骂人是不对的,我们程序员都是高素质人群嘛。哈哈。因该像色情网站里的会员那么有素质才对嘛。

------解决方案--------------------
SQL code

--1
SELECT * FROM dbo.Record WHERE phone IN ('86204527','94')

--2
DECLARE @sql VARCHAR(4000)

SET @sql = 'SELECT * FROM dbo.Record WHERE phone IN (''86204527'',''94'')'

EXEC (@sql)

------解决方案--------------------
探讨

引用:
总的来说骂人是不对的,我们程序员都是高素质人群嘛。哈哈。因该像色情网站里的会员那么有素质才对嘛。


顶这个!

------解决方案--------------------
你这样是不行的
我以前也试过,他把你传入的数字算作是一个字符串
结果会变成
IN ('你传入的字符串')
所以说是不行的,只能用其他方法
CHARINDEX
我以前提问的一个帖子,别人给出了解决方案
http://topic.csdn.net/u/20100105/12/a6eab9a3-41e0-4ef5-bc6b-4cf16d9705f3.html
------解决方案--------------------
看三楼的样子,无论你输入什么值,用什么分隔符,应该都当成一个值传入,我看无解
------解决方案--------------------
看这个问题看得很郁闷呀!

一、楼主说的一句话“不知者无畏”,很赞,赞给部分回答问题者和楼主
二、看到技术人员不应该有的浮躁,很浮躁,不听、不看、不闻,只以为自已最大,其不知天外有天
三、对于问题提出者可以理解想得到答案的心情,但要好好耐着性子看别我的回答,即使别人说错了,也要理想别人想帮你解答问题的心情
四、为什么不试就回答呢?你试过了吗?你真正看懂别人描述的问题吗?
五、在csdn中的各位同学浮躁的不少,可以学学itpub,那里的专家很有耐心
六、由于部分人没有注意楼主“我在程序里面”或没有遇到过类似问题或没有直接写过程序,所以很多人答非所问,楼主的我在程序里面的意思是,他在写程序的时候比如用C#、java、C++、DELPHI等语言写应用程序的时候,而不是直接在PL/SQL或SQLPLUS或SQLSERVER的查询分析器中去查询

其实“青龙白虎”和“一只小鸟”两位同学都把问题分析清楚了。


我的通行做法:
一、直接串SQL串,不使用?来处理:
String a="600600,600112"
select * from Show2003 where S1 in ("+a+");”
二、“select * from Show2003 where S1 in ('600600','600112');”将in做为一个整串处理
String s="in ('600600','600112')";
select * from Show2003 where S1 ?;
三、在存储过程中处理
http://blog.csdn.net/e_wsq/article/details/7527154



个人觉得我的回复已足够详尽,请不要谩骂!