非身经百战的高手不能解决的小问题--IN 参数传入

barleywu 2012-06-08 08:54:42
我这样写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)的,数值型的不要试了。
...全文
711 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
manpages 2012-10-27
  • 打赏
  • 举报
回复
也可以把数据填到一个临时表里,然后这样

.. IN (SELECT foo FROM bar)
barleywu 2012-10-26
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 的回复:]

上帖第一种方法还不能直接适用要求。
[/Quote]

别纠结了,我不是问怎么实现此类功能什么的。

我只是问在那个工具里面怎么去填? 要是写程序,那是怎么都是可以做到的。
manpages 2012-10-26
  • 打赏
  • 举报
回复
上帖第一种方法还不能直接适用要求。
manpages 2012-10-23
  • 打赏
  • 举报
回复


估计这里的“两个参数”,实际上被当作一个参数了。逗号分割符也成了参数内容的一部分。

你可以这样

1.
PREPARE fooplan (int, text, bool, numeric) AS
INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);


2.
expression = value1
OR
expression = value2
OR
冷月宫主 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
wddw1986, 你哪只眼睛看出不对了,我传入一个参数都执行成功了,何况我要问题的问题你不清楚吗? SQL不对我回来这里问你?

加个图
[/Quote]

由于你的截图很小,没有看到你使用的是什么工具。

如果是PL/SQL或SQLSERVER的查询分析器,耐下性子,成熟了后会笑自已的.
冷月宫主 2012-06-11
  • 打赏
  • 举报
回复
看这个问题看得很郁闷呀!

一、楼主说的一句话“不知者无畏”,很赞,赞给部分回答问题者和楼主
二、看到技术人员不应该有的浮躁,很浮躁,不听、不看、不闻,只以为自已最大,其不知天外有天
三、对于问题提出者可以理解想得到答案的心情,但要好好耐着性子看别我的回答,即使别人说错了,也要理想别人想帮你解答问题的心情
四、为什么不试就回答呢?你试过了吗?你真正看懂别人描述的问题吗?
五、在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



个人觉得我的回复已足够详尽,请不要谩骂!
barleywu 2012-06-11
  • 打赏
  • 举报
回复
好了好了,结贴给分了。

谢谢大家的回复。我也有不淡定的地方,可能我是老鸟了,看到菜鸟这么肤浅就气愤,因为我们以前不是这样的啊,都是踏踏实实的。我带过一些徒弟,对他们也是非常严格的,所以他们也都有所小成。不知道这样能否让被我批评的人释怀呢?
屌絲來襲 2012-06-10
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 的回复:]

IN (?) 这样的表达式的?表示是一个参数,而不是一串参数。
如果你用一个字符串传入,不管这个字符串你是怎么弄,sql只是认为In()中的列表只有一个值。
[/Quote]
正解,oledb数据源中 ? 是参数的占位符,一个?是一个参数,所以用一个? 传两个参数肯定不对
barleywu 2012-06-08
  • 打赏
  • 举报
回复
楼上素质高的也有分。
barleywu 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

无解?!
明白LZ的意思,所以特地用SQL跟踪了,发现SQL服务器在执行带参数的T-SQL语句时用的是执行储存过程sp_executesql,而且针对varchar的参数,在参数头尾判断单引号,参数中遇到单引号(')时使用了双单引号(不是双引号)替换来防止语句错误。
楼主用的工具应该是封装过执行语句的吧。MSSQL中的参数应该是@开头,不是用?代替吧?
顺便Mark下 看有没有高手能绕过S……
[/Quote]

我也是猜测是进行了参数的处理,所以才试了那么多可能,

我也试过ESCAPE啊, 用\' 什么的,都没用。我用的是OLEDB,其实用什么都无所谓啦。 我用VS工具不也是一样不行嘛。

另外在声明一次,我已经用格式化SQL String 的方法workaround了,所以别在告诉我拼接字符串。我是想解决掉这个遇到的问题,虽然可以避免,但是要是不解决过段时间就忘记这个事了。
盜令玊 2012-06-08
  • 打赏
  • 举报
回复
无解?!
明白LZ的意思,所以特地用SQL跟踪了,发现SQL服务器在执行带参数的T-SQL语句时用的是执行储存过程sp_executesql,而且针对varchar的参数,在参数头尾判断单引号,参数中遇到单引号(')时使用了双单引号(不是双引号)替换来防止语句错误。
楼主用的工具应该是封装过执行语句的吧。MSSQL中的参数应该是@开头,不是用?代替吧?
顺便Mark下 看有没有高手能绕过SQL的引号替换法则来实现LZ的功能!!!!
barleywu 2012-06-08
  • 打赏
  • 举报
回复
楼上老实人,不会也给分。少一点而已。
  • 打赏
  • 举报
回复
青龙白虎的第2种方法最好,可以缓存执行计划,提高性能。
hahajing3998 2012-06-08
  • 打赏
  • 举报
回复
我不会,楼主您别骂我
__天涯寻梦 2012-06-08
  • 打赏
  • 举报
回复
看你的“?”符号难道是 mysql ? mysql 一样不支持数组参数
cheng2005 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

还是就事论事吧,就这个问题,谁能解决,说太多无关的东西没意义啊,这才离被开除不远呢。
[/Quote]
我不知道你想要什么答案。既然你说下面的语句是没问题。
select * from Show2003 where S1 in ('600600','600112');
那还有什么问题呢?你就直接拼出这个语句不就完事了。
如果不是你自己的代码来生成这个语句,那你就需要改进生成sql的那部分代码。
如果那部分已经封装好了,那么就没办法了,人家本身不支持的东西,你还想让人家支持,这不是异想天开吗。
barleywu 2012-06-08
  • 打赏
  • 举报
回复
yibey 这个sb纯属脑子问题

我都说了S1 是 VARCHAR()了,你还说什么 “用传入参数的方式来使用整数类型的S1的时候”。

既然你说IN的官方文档, “expression[ ,... n ] ” 那你给一个正确的输入?

比如废话一堆全是放屁。
yibey 2012-06-08
  • 打赏
  • 举报
回复
看了3楼的回答,我先说一句楼主SB。。
再来就事论事。。

in 的函数的官方文档
参数
test_expression
任何有效的表达式。

subquery
包含某列结果集的子查询。该列必须与 test_expression 具有相同的数据类型。

expression[ ,... n ]
一个表达式列表,用来测试是否匹配。所有的表达式必须与 test_expression 具有相同的类型。

这里很明确的告诉你,传入参数必须与test_expression类型一致。。
也就是说如果你是使用传入参数的方式来使用整数类型的S1的时候,系统自动会作强制转化,那么试问你上面的哪些个测试有哪个是可以使用呢。。

如果非要这么做目前建议还是使用SQL拼接,坐等SQL做改进
__天涯寻梦 2012-06-08
  • 打赏
  • 举报
回复
是 Sql server 吗,它不直接支持数组参数,这样确实麻烦,可以看看这个
SQL SERVER “数组参数”
barleywu 2012-06-08
  • 打赏
  • 举报
回复
还是就事论事吧,就这个问题,谁能解决,说太多无关的东西没意义啊,这才离被开除不远呢。
加载更多回复(22)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧