2010-07-28 55 views

回答

5

絕對是第一種方式,因爲2次調用getdate()很可能會返回不同的值。

+0

+1我認爲你是對的,它可以返回不同的結果。 – 2010-07-28 13:55:46

+0

@Martin Smith,你看到它發生了嗎? – Fredou 2010-07-28 13:56:59

+0

@Fredou - 如果是我,即使使用第二種方式不會導致問題,我仍然會使用第一種方法。沒有什麼能夠阻止微軟在未來的SQL Server版本中改變這種行爲的方式,所以如果你依賴它,那麼你的代碼就會崩潰。在我看來,以最清晰的方式做事情總是最好的。第一種方法是,沒有人需要查看代碼並且想知道「嗯,這是否真的在做它應該做的事情」? – dcp 2010-07-28 14:01:44

0

實際上,這取決於SQL的版本。

GetDate()是SQL 2005之前的確定性函數。返回的答案與陳述期限相同。

在SQL 2005(及以後)中,Getdate()是非確定性的,這意味着每次調用它時都會得到不同的值。

由於GetDate()函數將在更新開始前評估,IMO會返回相同的值。

不知道你的表和分區的大小和你的服務器上的負載,我會去的選項#1

+0

我在SQL2008的回答中運行了我的'select'測試。我認爲確定性只是意味着具有相同參數的重複調用會得到相同的結果。 – 2010-07-28 13:48:00

2

原來的答案: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

嘗試它的有趣的方式,讓我試試:-)和2,000,000行後,它們的價值都是相同的 – Fredou 2010-07-28 13:45:33

+0

@Fredou - 我認爲dcp的答案是正確的,雖然我會在一秒鐘內更新我的。 – 2010-07-28 13:56:24

+0

嗯好的,謝謝你的例子 – Fredou 2010-07-28 14:05:47

0

我要去比性能以外的東西:意向的可讀性/通信。

沿着這些路線,選項一可能會更好。實際上,你告訴未來的開發者「我明確將f1f2設置爲相同的DateTime。」如果未來需求發生變化,並且(由於某種原因)f1f2必須在不同的時間更新(或者發生了某些變化並且在不同時間進行評估),那麼兩者的日期時間仍然相同。

在選項二中,您要說的是,f1f2必須隨其更新操作的當前時間更新。同樣,如果您的需求發生變化,並且出於某種原因需要在單獨的報表中進行評估,那麼現在他們不再需要同樣的價值。