0

誰かがこれを説明できますか?理論的には両方とも同じクエリですが、答えは異なります。

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」を返し、これは正解ですが、2番目の文のセットでは、同じクエリが文字列を介して動的に実行されますが、答えは「0」です。

4

1 に答える 1

0

最初に、有効な SQL は次のとおりです。

select count(*) from table1 where (from <= '03/02/2013') and ('03/02/2013' <= to)

2 番目の例では、有効な SQL は次のとおりです。

select count(*) from table1 where (from <= 03/02/2013) and (03/02/2013 <= to)

つまり、最初のものは区切り記号を必要としない変数を使用します。2 番目のものには、「定数の折りたたみ」が適用された整数定数の式があります。整数 3 を 2 で割って 2013 で割った値 = 0 = 01 1900 年 1 月 1 日を日付に変更した場合

これが必要です:

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

yyyymmdd一貫性と明確さのために、または ISO 8601 の日付を使用する必要があることに注意してください。

于 2013-02-08T09:36:15.897 に答える