Bagikan melalui


Fungsi Deterministik dan Nondeterministik

Fungsi deterministik selalu mengembalikan hasil yang sama kapan saja dipanggil dengan serangkaian nilai input tertentu dan diberi status database yang sama. Fungsi nondeterministik dapat mengembalikan hasil yang berbeda setiap kali dipanggil dengan serangkaian 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 seperti itu. 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.

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

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. Untuk daftar fungsi ini, lihat Fungsi String (Transact-SQL).

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

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

Fungsi berikut tidak selalu deterministik, tetapi dapat digunakan dalam tampilan atau indeks terindeks pada kolom komputasi ketika 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 datetime, , smalldatetimeatau sql_variant.
CONVERT Deterministik kecuali salah satu kondisi ini ada:

Jenis sumber adalah sql_variant.

Jenis target adalah sql_variant dan jenis sumbernya nondeterministik.

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 konstan. Selain itu, gaya kurang dari atau sama dengan 100 adalah nondeterministik, kecuali untuk gaya 20 dan 21. Gaya yang lebih besar dari 100 deterministik, kecuali untuk gaya 106, 107, 109 dan 113.
CHECKSUM Deterministik, dengan pengecualian 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 konfigurasi, kursor, metadata, keamanan, dan statistik sistem tidak menentukan. Untuk daftar fungsi ini, lihat Fungsi Konfigurasi (Transact-SQL), Fungsi Kursor (Transact-SQL), Fungsi Metadata (Transact-SQL), Fungsi Keamanan (Transact-SQL), dan Fungsi Statistik Sistem (Transact-SQL).

Fungsi bawaan berikut dari kategori lain selalu nondeterministik.

@@CONNECTIONS GETDATE
@@CPU_BUSY GETUTCDATE
@@DBTS GET_TRANSMISSION_STATUS
@@IDLE LAG
@@IO_BUSY LAST_VALUE
@@MAX_CONNECTIONS LEAD
@@PACK_RECEIVED MIN_ACTIVE_ROWVERSION
@@PACK_SENT NEWID
@@PACKET_ERRORS NEWSEQUENTIALID
@@TIMETICKS VALUE SELANJUTNYA UNTUK
@@TOTAL_ERRORS NTILE
@@TOTAL_READ PARSENAME
@@TOTAL_WRITE PERCENTILE_CONT
CUME_DIST PERCENTILE_DISC
CURRENT_TIMESTAMP PERCENT_RANK
DENSE_RANK RAND
FIRST_VALUE 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. Anda tidak boleh mengandalkan pengembalian tataan 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 akan 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 diperpanjang.

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 ini saat memberikan izin kepada pengguna lain untuk menjalankan prosedur.