Fungsi deterministik dan nondeterministik

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Fungsi deterministik selalu mengembalikan hasil yang sama setiap kali dipanggil dengan sekumpulan nilai input tertentu dan diberi status database yang sama. Fungsi nondeterministik dapat mengembalikan hasil yang berbeda setiap kali dipanggil dengan sekumpulan nilai input tertentu meskipun status database yang mereka akses tetap sama. Misalnya, fungsi AVG selalu mengembalikan hasil yang sama mengingat kualifikasi yang dinyatakan di atas, tetapi fungsi GETDATE, yang mengembalikan nilai tanggalwaktu saat ini, selalu mengembalikan hasil yang berbeda.

Ada beberapa properti fungsi yang ditentukan pengguna yang menentukan kemampuan Mesin Database SQL Server untuk mengindeks hasil fungsi, baik melalui indeks pada kolom komputasi yang memanggil fungsi, atau melalui tampilan terindeks yang mereferensikan fungsi. Determinisme fungsi adalah salah satu properti tersebut. Misalnya, indeks berkluster tidak dapat dibuat pada tampilan jika tampilan mereferensikan fungsi nondeterministik. Untuk informasi selengkapnya tentang properti fungsi, termasuk determinisme, lihat Fungsi yang Ditentukan Pengguna.

Fungsi deterministik harus terikat skema. SCHEMABINDING Gunakan klausa saat membuat fungsi deterministik.

Artikel ini mengidentifikasi determinisme fungsi sistem bawaan dan efek pada properti deterministik fungsi yang ditentukan pengguna ketika berisi panggilan ke prosedur tersimpan yang diperluas.

Menentukan apakah fungsi deterministik

Anda dapat memeriksa apakah fungsi deterministik dengan mengkueri is_deterministic properti objek untuk fungsi tersebut. Contoh di bawah ini menentukan apakah fungsinya Sales.CalculateSalesTax deterministik.

SELECT OBJECTPROPERTY(OBJECT_ID('Sales.CalculateSalesTax'), 'IsDeterministic');

Determinisme fungsi bawaan

Anda tidak dapat memengaruhi determinisme fungsi bawaan apa pun. Setiap fungsi bawaan bersifat deterministik atau nondeterministik berdasarkan bagaimana fungsi diimplementasikan oleh SQL Server. Misalnya, menentukan klausa ORDER BY dalam kueri tidak mengubah determinisme fungsi yang digunakan dalam kueri tersebut.

Semua fungsi bawaan string bersifat deterministik, kecuali FORMAT. Untuk daftar fungsi ini, lihat Fungsi String (Transact-SQL).

Fungsi bawaan berikut dari kategori fungsi bawaan selain fungsi string selalu deterministik.

  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATN2
  • CEILING
  • COALESCE
  • COS
  • COT
  • DATALENGTH
  • DATEADD
  • DATEDIFF
  • DAY
  • DEGREES
  • EXP
  • FLOOR
  • ISNULL
  • ISNUMERIC
  • LOG
  • LOG10
  • MONTH
  • NULLIF
  • POWER
  • RADIANS
  • ROUND
  • SIGN
  • SIN
  • SQRT
  • SQUARE
  • TAN
  • YEAR

Fungsi berikut tidak selalu deterministik, tetapi dapat digunakan dalam tampilan atau indeks terindeks pada kolom komputasi saat ditentukan dengan cara yang deterministik.

Fungsi Komentar
semua fungsi agregat Semua fungsi agregat bersifat deterministik kecuali ditentukan dengan klausa OVER dan ORDER BY. Untuk daftar fungsi ini, lihat Fungsi Agregat (Transact-SQL).
CAST Deterministik kecuali digunakan dengan tanggalwaktu, smalldatetime, atau sql_variant.
CONVERT Deterministik kecuali salah satu kondisi ini ada:

Jenis sumber sql_variant.

Jenis target sql_variant dan jenis sumbernya tidak mendeterministik.

Jenis sumber atau target adalah datetime atau smalldatetime, jenis sumber atau target lainnya adalah string karakter, dan gaya nondeterministik ditentukan. Agar deterministik, parameter gaya harus konstanta. Selain itu, gaya kurang dari atau sama dengan 100 tidak mendeterministik, kecuali untuk gaya 20 dan 21. Gaya yang lebih besar dari 100 deterministik, kecuali untuk gaya 106, 107, 109 dan 113.
CHECKSUM Deterministik, kecuali CHECKSUM(*).
ISDATE Deterministik hanya jika digunakan dengan fungsi CONVERT, parameter gaya CONVERT ditentukan dan gaya tidak sama dengan 0, 100, 9, atau 109.
RAND RAND hanya deterministik ketika parameter benih ditentukan.

Semua fungsi statistik konfigurasi, kursor, metadata, keamanan, dan sistem bersifat nondeterministik. Anda dapat melihat daftar fungsi-fungsi ini.

Fungsi bawaan berikut dari kategori lain selalu tidak mendeterministik.

  • @@CONNECTIONS
  • @@CPU_BUSY
  • @@DBTS
  • @@IDLE
  • @@IO_BUSY
  • @@MAX_CONNECTIONS
  • @@PACKET_ERRORS
  • @@PACK_RECEIVED
  • @@PACK_SENT
  • @@TIMETICKS
  • @@TOTAL_ERRORS
  • @@TOTAL_READ
  • @@TOTAL_WRITE
  • PADA ZONA WAKTU
  • CUME_DIST
  • CURRENT_TIMESTAMP
  • DENSE_RANK
  • FIRST_VALUE
  • FORMAT
  • GETDATE
  • GETUTCDATE
  • GET_TRANSMISSION_STATUS
  • LAG
  • LAST_VALUE
  • LEAD
  • MIN_ACTIVE_ROWVERSION
  • NEWID
  • NEWSEQUENTIALID
  • VALUE SELANJUTNYA UNTUK
  • NTILE
  • PARSENAME
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • PERCENT_RANK
  • RAND
  • RANK
  • ROW_NUMBER
  • TEXTPTR

Memanggil prosedur tersimpan yang diperluas dari fungsi

Fungsi yang memanggil prosedur tersimpan yang diperluas bersifat nondeterministik, karena prosedur tersimpan yang diperluas dapat menyebabkan efek samping pada database. Efek samping adalah perubahan pada status global database, seperti pembaruan ke tabel, atau ke sumber daya eksternal, seperti file atau jaringan; misalnya, mengubah file atau mengirim pesan email. Jangan mengandalkan pengembalian hasil yang konsisten saat menjalankan prosedur tersimpan yang diperluas dari fungsi yang ditentukan pengguna. Fungsi yang ditentukan pengguna yang membuat efek samping pada database tidak disarankan.

Ketika dipanggil dari dalam fungsi, prosedur tersimpan yang diperluas tidak dapat mengembalikan tataan hasil ke klien. Setiap API Open Data Services yang mengembalikan tataan hasil ke klien, memiliki kode pengembalian FAIL.

Prosedur tersimpan yang diperluas dapat tersambung kembali ke SQL Server. Namun, prosedur tidak dapat bergabung dengan transaksi yang sama dengan fungsi asli yang memanggil prosedur tersimpan yang diperluas.

Mirip dengan pemanggilan dari batch atau prosedur tersimpan, prosedur tersimpan yang diperluas dijalankan dalam konteks akun keamanan Microsoft Windows tempat SQL Server berjalan. Pemilik prosedur tersimpan yang diperluas harus mempertimbangkan izin konteks keamanan ini, saat memberikan izin kepada pengguna lain untuk menjalankan prosedur.

Baca juga