SQL Server с обновлением и 2 поля datetime и getdate () - PullRequest
0 голосов
/ 28 июля 2010

требование, оба поля должны быть равны, что бы вы сделали

declare @var datetime

set @var = getdate()

update table set f1=@var,f2=@var

или просто

update table set f1=getdate(),f2=getdate()

Ответы [ 4 ]

5 голосов
/ 28 июля 2010

Определенно первый способ, потому что 2 вызова getdate (), скорее всего, будут возвращать разные значения.

2 голосов
/ 28 июля 2010

Оригинальный ответ: getdate() похоже на rand() и оценивается только один раз в запросе.Этот запрос занял больше минуты, и все getdate() одинаковы.

select getdate()
from sys.objects s1, sys.objects s2, sys.objects s3

Обновлено Но когда я посмотрел план запроса на обновление 2 разных столбцовЯ мог видеть, что вычислительный скалярный оператор дважды вызывал getdate().

Я тестировал на наличие обновления с rand()

CREATE TABLE #t(
    [f1] [float] NULL,
    [f2] [float] NULL,
)
insert into #t values (1,1)
insert into #t values (2,2)
insert into #t values (3,3)


update #t set f1=rand(),f2=rand()
select * from #t

, который дает

f1                     f2
---------------------- ----------------------
0.54168308978257       0.574235819564939
0.54168308978257       0.574235819564939
0.54168308978257       0.574235819564939
0 голосов
/ 28 июля 2010

Я собираюсь пойти с чем-то другим, кроме производительности: читаемость / передача намерений.

Вдоль этих линий вариант 1, вероятно, лучше.По сути, вы говорите будущим разработчикам: «Я явно устанавливаю f1 и f2 в один и тот же DateTime».Если требования изменятся в будущем и (по какой-то причине) f1 и f2 придется обновлять в разное время (или что-то меняется, и они оцениваются в разное время), у вас все равно будет одинаковое время и дата для обоих.

Во втором варианте все, что вы говорите, это то, что f1 и f2 должны обновляться с текущим временем, когда выполняются их операции обновления.Опять же, если что-то меняется в ваших требованиях и по какой-то причине их нужно оценивать в отдельных утверждениях, теперь они больше не обязательно будут одинаковыми.

0 голосов
/ 28 июля 2010

На самом деле это зависит от версии SQL.

GetDate () была детерминированной функцией до SQL 2005 .Возвращенный ответ имел одно и то же значение для продолжительности оператора.

В SQL 2005 (и далее) , Getdate () является недетерминированным, то есть каждый раз, когда вы его вызываетеполучит другое значение.

Поскольку обе функции GetDate () будут оценены до начала обновления, IMO вернется с одинаковым значением.

Не зная размера вашей таблицы иразделы и нагрузка на ваш сервер, я бы пошел с опцией # 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...