结合IN和Where查询SQL

时间:2013-02-28 11:14:22

标签: asp.net sql

 StrSqlLines = "Select * From dbo.SqlDtaToCreate WHERE DtaLineAccountToDebit = '" + Straccref + "' and DtaLineCode IN('" + joined + "')";

执行此查询时出现错误

Conversion failed when converting the varchar value '116743,116744,116745' to data type int.

但是,SQL

的查询工作正常
select * from SqlDtaToCreate where DtaLineAccountToDebit='123.567U' and DtaLineCode IN('116745','116746','116747')

4 个答案:

答案 0 :(得分:2)

首先:

这可能是SQL注入的一个坏例子!使用准备好的陈述(或至少适当的逃避)!

第二

您的直接问题是正确封闭了' IN子句:

 StrSqlLines = "Select * " +
               "From dbo.SqlDtaToCreate "
               " WHERE DtaLineAccountToDebit = '" + Straccref + "' " + 
               " and DtaLineCode IN(" + joined + ")"; //notice missing ' characters

'个字符所包含的任何内容都作为单个字符串进行处理。 SQL服务器试图将这个单个字符串解析为数字,但因为它不能解析,所以它报告了错误。

第三

当使用数字数据时,永远不会,永远不会(我提到从不吗?)使用文本数据来比较它 - 这可能会扼杀性能。 (在这种规模上,当然这并不重要,但记住这一点可以节省大量不必要的性能分析和调试......)

所以虽然这个查询确实有效:

select * from SqlDtaToCreate where DtaLineAccountToDebit='123.567U' and DtaLineCode IN('116745','116746','116747')

它对所提供的数据进行隐式转换,因此正确的方法是:

select * from SqlDtaToCreate where DtaLineAccountToDebit='123.567U' and DtaLineCode IN(116745,116746,116747)

答案 1 :(得分:0)

注意'变量中缺少joined

'116743,116744,116745'

'116745', '116746', '116747'

理想情况下,既然您需要比较INT,那么

116743,116744,116745

阅读sql injection

答案 2 :(得分:0)

对于加入的术语的转换,似乎数据库服务器可以转换包含在引号中的数字,但不能超过以逗号为单位的数字,在您的情况下:

'116743,116744,116745'

致:

'116745','116746','116747'

尝试重新格式化已加入以使用引号分隔数字。或者从sql statament中删除引号,以便获得IN(" + joined + ")"而不是:IN('" + joined + "')"

答案 3 :(得分:0)

请注意,您的两个查询不一样。程序化的单引号围绕整个数字组,而SQL测试在每个数字周围放置单引号。

可能你完全可以省略引用,但是:

StrSqlLines = "Select * From dbo.SqlDtaToCreate WHERE DtaLineAccountToDebit = '" 
   + Straccref + "' and DtaLineCode IN(" + joined + ")";