Использование GETDATE() в цикле WHILE всегда возвращает одно и то же значение.

Я понимаю из таких источников, что GETDATE() должен всегда (ну, в конце концов, в зависимости от скорости цикла) возвращать другое значение в цикле.

У меня есть этот TSQL:

DECLARE @WaitUntilTime DATETIME = DATEADD(SECOND, 10, GETDATE())

WHILE (DATEDIFF(SECOND, GETDATE(), @WaitUntilTime) > 0)
BEGIN
    SELECT GETDATE(), @WaitUntilTime
END

Но он всегда выводит одно и то же значение для GETDATE(), и цикл никогда не заканчивается через 10 секунд, как я этого хочу. Почему?

Я также нашел этот ответ, который звучит как аналогичный случай, но говорит о том, что GETDATE() оценивается один раз для столбца в SELECT запрос. Я не знаю, относится ли это и к циклу while.

Кстати, я знаю о WAITFOR, но не могу использовать это потому, что я хочу ввести задержку в пределах одного пакета.


person rory.ap    schedule 18.10.2016    source источник
comment
Ваш выбор является неявной транзакцией, в отличие от SET   -  person scsimon    schedule 18.10.2016


Ответы (1)


DECLARE @WaitUntilTime DATETIME = DATEADD(SECOND, 10, GETDATE())
DECLARE @Dummy int

WHILE (DATEDIFF(SECOND, GetDate(), @WaitUntilTime ) > 0)
BEGIN
    Set @Dummy=1
END
SELECT GetDate(), @WaitUntilTime 

Возврат после 10-секундной задержки

(No column name)        (No column name)
2016-10-18 13:53:20.000 2016-10-18 13:53:20.140
person John Cappelletti    schedule 18.10.2016
comment
Хорошо, спасибо! Можете ли вы объяснить, что не так с моим способом? Вопрос действительно в том, почему это происходит. - person rory.ap; 18.10.2016
comment
@rory.ap Вы собрали 10 072 069 SELECTS .. заменили манекен счетчиком (просто для удовольствия) - person John Cappelletti; 18.10.2016
comment
@JohnCappelletti - Все еще возникают проблемы с пониманием - это потому, что выборки занимают много времени по сравнению с назначением переменных, и в конечном итоге они дойдут до конца (после того, как они пройдут 10 миллионов выборок)? Обратите внимание: я сначала попробовал что-то похожее на ваш подход, прежде чем опубликовать этот вопрос, но у меня было SELECT 1 внутри цикла. Я искал неработающего. Если моя гипотеза верна (из-за выбора накладных расходов), применимо то же объяснение, и я просто выстрелил себе в ногу, сделав это. - person rory.ap; 18.10.2016
comment
@rory.ap Накладные расходы Select были неожиданными. Я поставил ваш оригинальный выбор вместо цикла и установил продолжительность на 1 секунду. Он сгенерировал 176 выборок за 12,362 секунды. - person John Cappelletti; 18.10.2016
comment
Что ж, спасибо за помощь, от одного жителя Новой Англии к другому! - person rory.ap; 18.10.2016
comment
@rory.ap Я продолжаю говорить своей жене, что я принадлежу Сент-Джонс на Виргинских островах. - person John Cappelletti; 18.10.2016