Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server:incuriosito da GETDATE()

GetDate() non è mai stato deterministico. Deterministico significa che restituirà sempre lo stesso risultato una volta passati gli stessi parametri.

In comune con rand() Viene valutato una volta per colonna ma una volta valutato rimane lo stesso per tutte le righe.

È più facile vedere questo comportamento con rand() di getdate()

select top 4 rand(), rand()
from sys.objects

Restituito

---------------------- ----------------------
0.0566172633850772     0.431111195699363
0.0566172633850772     0.431111195699363
0.0566172633850772     0.431111195699363
0.0566172633850772     0.431111195699363

Se provi quanto segue

select top 10 getdate(), getdate()
from sys.objects

e guarda le proprietà dell'operatore ComputeScalar nel piano di esecuzione effettivo vedrai che GetDate() viene valutato due volte.

NB:è possibile che questo comportamento di valutazione per colonna anziché per query sia cambiato dopo SQL 2000 (non lo so), ma non è quello che BOL definisce come il significato di deterministico.