Сравнение динамических и явных запросов в sql-server 2005

Кто-нибудь может это объяснить? Теоретически оба являются одним и тем же запросом, но дают разные ответы.

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».


person user2053679    schedule 08.02.2013    source источник


Ответы (1)


Во-первых, эффективный 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 = 01 января 1900 г. при изменении на дату

Вам понадобится это:

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

Обратите внимание, что вы должны использовать даты yyyymmdd или ISO 8601 для согласованности и ясности.

person gbn    schedule 08.02.2013