Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wird GETUTCDATE() denselben Wert zurückgeben, wenn es zweimal in derselben Anweisung verwendet wird?

Dank der von gbn bereitgestellten Links glaube ich, dass dies meine Frage beantwortet:

Gemeinsam mit rand() Es wird einmal pro Spalte ausgewertet, aber einmal ausgewertet bleibt für alle Zeilen gleich .... schauen Sie sich die Eigenschaften des ComputeScalar-Operators im tatsächlichen Ausführungsplan an, Sie werden sehen, dass GetDate() zweimal ausgewertet wird.

Ich habe es überprüft, und es scheint, dass dies in SQL Server 2008 immer noch auf die gleiche Weise geschieht:GetUtcDate() wird im Ausführungsplan doppelt ausgewertet. Es wird nicht zu unterschiedlichen Ergebnissen pro Zeile kommen, aber es ist möglich, dass es zu unterschiedlichen Ergebnissen pro Spalte kommt, wenn das Timing genau richtig ist.

Bearbeiten

Ich kann dieses Verhalten tatsächlich beweisen! Versuchen Sie Folgendes:

select GETUTCDATE(), RAND(), RAND(), ...[~3000 RAND()s]..., RAND(), GETUTCDATE()
from [TableOfYourChoice]

In meinem Experiment landete ich bei 2011-05-17 20:47:34.247 in der ersten Spalte und 2011-05-17 20:47:34.250 in der letzten Spalte, die einen Unterschied von drei Millisekunden als Ergebnis der Auswertung aller RAND() zeigt s zwischen dem ersten und zweiten Aufruf von GETUTCDATE().