2013-03-28 2 views
-1

У меня есть динамический запрос в моей процедуре магазина. Когда я добавил условие, чтобы проверить, существует ли дата между условиями, она вызывает следующую ошибку:динамический sql-запрос с условием проверки даты?

Ошибка конверсии при преобразовании даты и/или времени из символьной строки.

Вот мой запрос:

@EffDate datetime = GETDATE() 

внутри моего динамического запроса:

set @query = @query + ' WHERE ' + @EffDate + ' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_EndDate, 121)'; 

Как справиться с этим условием?

+1

почему бы не написать это как ' 'WHERE GETDATE() между ними. ..'? –

+0

Мне нужно передать это @EffDate извне, но по умолчанию текущая дата. – user1882705

ответ

1

Ваш производится значение @query выглядит как (например):

WHERE 2008-01-01 00:00:00.000 BETWEEN ... 

Вы должны добавить кавычки вокруг @EffDate в запросе:

set @query = @query + ' WHERE ''' + CONVERT(nvarchar(24), @EffDate,121) + ''' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_EndDate, 121)'; 
3

Поскольку вы конкатенации с DateTime в вашей строке вы должны преобразовать его в строку первой:

set @query = @query 
    + ' WHERE ''' 
    + CONVERT(nvarchar(24),@EffDate, 121) 
    + ''' BETWEEN CONVERT(nvarchar(24), a.Eff_StartDate, 121) AND CONVERT(nvarchar(24), a.Eff_EndDate, 121)'; 
+0

Это все равно не будет работать без кавычек вокруг проходящего литерала. –

+0

Как всегда, будьте осторожны с SQL Injection! Этот запрос выглядит уязвимым. –

+0

@KyleHale Есть котировки – Taryn

0

В случае @EffDate не всегда GETDATE(), вы можете использовать CAST:

CAST(@EffDate AS VARCHAR) 

и ваш код должен работать нормально. Вы должны поставить одиночные кавычки вокруг него:

'WHERE @EffDate =' + '' '' + CAST (@EffDate AS VARCHAR) + '' '' + .....

Смежные вопросы