Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server:zaintrygowany GETDATE()

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między skanowaniem tabeli a skanowaniem indeksu klastrowego?

  2. Jak przypisać wynik exec do zmiennej sql?

  3. Przycinanie T-SQL   (i inne znaki niealfanumeryczne)

  4. Uzyskać wszystkie nazwy tabel w określonej bazie danych za pomocą zapytania SQL?

  5. Wewnętrzne sprzężenie SQL na wartościach zerowych