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')
答案 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
答案 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 + ")";