2013-02-08 57 views
0

任何人都可以解釋這一點嗎? 理論上兩者都是相同的查詢,但他們給出不同的答案。sql-server 2005中的動態與顯式查詢

一個)

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

在第一,有效的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日期一致性和清晰度

+0

非常感謝你GBN,這是絕對清楚的。 – user2053679