GetDate()
nigdy nie był deterministyczny. Deterministyczny oznacza, że po przekazaniu tych samych parametrów zawsze zwróci ten sam wynik.
Podobnie jak rand()
Jest oceniany raz na kolumnę ale raz ocenione pozostaje takie samo dla wszystkich wierszy.
Łatwiej jest zobaczyć to zachowanie dzięki rand()
niż getdate()
select top 4 rand(), rand()
from sys.objects
Zwrócone
---------------------- ----------------------
0.0566172633850772 0.431111195699363
0.0566172633850772 0.431111195699363
0.0566172633850772 0.431111195699363
0.0566172633850772 0.431111195699363
Jeśli spróbujesz wykonać następujące czynności
select top 10 getdate(), getdate()
from sys.objects
i spójrz na właściwości operatora ComputeScalar w rzeczywistym planie wykonania, zobaczysz, że GetDate()
jest oceniany dwukrotnie.
Uwaga:Możliwe, że to zachowanie oceny według kolumny, a nie według zapytania, zmieniło się po SQL 2000 (nie wiem), ale nie to BOL definiuje jako znaczenie deterministyczne.