Ich habe eine SELECT-Anweisung, die GETDATE() für zwei verschiedene Spaltenwerte verwendet. Ich frage mich, ob diese beiden getrennten Funktionsaufrufe in der gleichen SELECT-Anweisung jedes Mal identische Werte zurückgeben?Auswahl der Funktion GETDATE() zweimal in einer Auswahlliste - der gleiche Wert für beide?
Antwort
Ja, sie geben das gleiche Datum und die gleiche Uhrzeit in Millisekunden zurück.
SELECT GETDATE(), GETDATE()
Returns
2010-10-29 15:34:06.353 2010-10-29 15:34:06.353
Ich habe dies getestet mit 4000, GETDATE()
und sie alle gleich zurück.
Die meisten Systemfunktionen werden pro Abfrage ausgewertet, nicht pro Zeile, außer denen, die per Definition statistisch eindeutig wie NEWID() sind. Dazu gehören Dinge wie RAND() (die nicht eindeutig ist, nur pseudozufällig), es sei denn, sie werden Zeile für Zeile mit NEWD() zufällig gesetzt.
Determinismus ist nicht auf diese Auswertung im Zusammenhang, weil es bedeutet, „die Ausgabe das gleiche für einen bestimmten Eingang ist unabhängig von, sagen wir, Sprache oder DMY/MDY)
Dieses‚einmal pro Abfrage‘Auswertung macht Sinn, natürlich , speziell für GETDATE().
Wenn ich eine 10k Zeilenaktualisierung mache, möchte ich, dass jede Zeile den gleichen Wert von GETDATE() hat.Das gesamte Update könnte leicht> 3,33 Millisekunden dauern und ich möchte keine anderen Werte meine 10k Reihen
Dies wäre eine einmal pro Funktion pro Abfrage, wenn also die Abfrage mehrere Instanzen von GETDATE() enthält, würde jede davon eine verursachen Aufruf der Funktion GETDATE(). – StriplingWarrior
@StriplingWarrior http://sqlfiddle.com/#!6/27bad6/1 sagt anders, und GETDATE() wird einmal pro Abfrage ausgeführt – gbn
Nun, ich bin nicht ganz klar auf die inneren Abläufe des Ausführungsplans. Ich kann völlig sehen, warum Sie erwarten, dass dieses Beispiel die Oberfläche von GETDATE() doppelt ausführt. Ich vermute jedoch, dass es nicht das tut, was Sie erwarten. http://sqlfiddle.com/#!6/27bad6/7/0 zeigt, dass selbst ohne den Verzögerungsaufruf GETDATE() immer wieder mit anderen Werten endet. – StriplingWarrior
Entschuldigung, es zu sagen, aber ich kam gerade mit einem Test, um zu zeigen, dass es nicht immer geben Sie den gleichen Wert zurück. Es wird tatsächlich zweimal ausgewertet, und wenn sich die Systemuhr während der Zeit zwischen diesen beiden Auswertungen umkehrt, können Sie leicht unterschiedliche Zeiten für die beiden Aufrufe erhalten.
Die anderen haben jedoch recht, dass es nicht einmal pro Zeile ausgewertet wird: nur einmal pro Spalte.
Siehe Will GETUTCDATE() return the same value if used twice in the same statement?
Testing mit 4.000 getdate()
nicht beweisen, dass es nie passieren kann.
SET NOCOUNT ON;
DECLARE @T TABLE
(
rownum INT IDENTITY(1,1) PRIMARY KEY,
d1 DATETIME,
d2 DATETIME
)
WHILE (5 > (SELECT COUNT(*) FROM @T WHERE d1 <> d2))
BEGIN
DELETE FROM @T WHERE d1 = d2
INSERT INTO @T
SELECT GETDATE(),GETDATE()
END
SELECT * FROM @T
Beispiel Ergebnisse
rownum d1 d2
----------- ----------------------- -----------------------
22381 2011-05-18 12:24:14.433 2011-05-18 12:24:14.437
30912 2011-05-18 12:24:15.420 2011-05-18 12:24:15.423
43234 2011-05-18 12:24:16.717 2011-05-18 12:24:16.720
113360 2011-05-18 12:24:24.210 2011-05-18 12:24:24.213
147855 2011-05-18 12:24:27.817 2011-05-18 12:24:27.820
Dies ist nicht zuverlässig Verhalten. Siehe meinen Beitrag. – StriplingWarrior
Ja. 4.000 ist nicht hoch genug, um dieses Verhalten zuverlässig zu erkennen, wie meine Antwort zeigt. –
-1, da dies leider nicht korrekt ist, siehe Antwort von @MartinSmith – Oskar