Нет, не безопасно. Вы столкнулись с так называемым константы времени выполнения, из которых GETDATE()
является примером книжного шкафа, которые оцениваются один раз при запуске запроса, а затем используется кэшированное оцененное значение. Однако каждое вхождение оценивается отдельно один раз, и две оценки могут приходиться на разные стороны границы точности даты и времени, что приводит к двум разным значениям.
Простой тест показывает, как это происходит:
declare @cnt int = 0, @i int = 0
while @cnt = 0
begin
select @cnt = count(*)
from master..spt_values
where getdate() != getdate();
set @i += 1;
if @cnt != 0
raiserror(N'@cnt = %d this shoudl not happen but it dit after @i = %d', 16, 1, @cnt, @i);
end
В моем случае это было сразу же поражено:
Msg 50000, Level 16, State 1, Line 9
@cnt = 2515 this shoudl not happen but it dit after @i = 694
Я не рассматриваю вопрос о том, как лучше это сделать (у вас уже есть много советов), но основной вопрос, верно ли ваше предположение о выполнении во время выполнения (нет):
GETDATE()
дважды в операторе будет оцениваться дважды
person
Remus Rusanu
schedule
20.08.2012