有人可以解释一下吗? 从理论上讲,两者都是相同的查询,但它们给出了不同的答案。
A)
declare @date varchar(10)
set date = '03/02/2013'
select count(*) from table1 where (from <= @date) and (@date <= to)
b)中
declare @date varchar(10)
set date = '03/02/2013'
set @sqlstring = 'select count(*) from table1 where (from <= ' + @date + ') and (' + @date + ' <= to)'
exec sp_executeSql @sqlstring
第一组句子给出'2'作为结果,这是正确答案,但在第二组句子中,我通过字符串动态执行相同的查询,但答案是'0'。
答案 0 :(得分:0)
首先,有效的SQL是
select count(*) from table1 where (from <= '03/02/2013') and ('03/02/2013' <= to)
在第二个中,有效的SQL是
select count(*) from table1 where (from <= 03/02/2013) and (03/02/2013 <= to)
也就是说,第一个使用不需要分隔符的变量。在第二个中,您有一个整数常量的表达式,其中应用了“constant folding”。整数3除以2除以2013 = 0 = 1900年1月1日更改为日期
你需要这个:
set @sqlstring = 'select count(*) from table1
where (from <= ''' + @date + ''') and (''' + @date + ''' <= to)'
请注意,为了保持一致性和清晰度,您应该使用yyyymmdd
或ISO 8601日期