0

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

一个)

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

4

1 回答 1

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)

也就是说,第一个使用不需要分隔符的变量。在第二个中,你有一个整数常量表达式,它应用了“常量折叠”。整数 3 除以 2 除以 2013 = 0 = 1900 年 1 月 1 日更改为日期

你需要这个:

set @sqlstring = 'select count(*) from table1
    where (from <= ''' + @date + ''') and (''' + @date + ''' <= to)' 

请注意,您应该使用yyyymmddISO 8601 日期以保持一致性和清晰性

于 2013-02-08T09:36:15.897 回答