sql-server 2005中的动态与显式查询

时间:2013-02-08 09:09:03

标签: sql-server-2005-express

有人可以解释一下吗? 从理论上讲,两者都是相同的查询,但它们给出了不同的答案。

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'。

1 个答案:

答案 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日期