Fungsi Skalar yang Ditentukan Pengguna untuk In-Memory OLTP

Berlaku untuk: SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Di SQL Server 2016 (13.x), Anda dapat membuat dan menghilangkan fungsi yang dikompilasi dan ditentukan pengguna skalar secara asli. Anda juga dapat mengubah fungsi yang ditentukan pengguna ini. Kompilasi asli meningkatkan performa evaluasi fungsi yang ditentukan pengguna dalam Transact-SQL.

Saat Anda mengubah fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar, aplikasi tetap tersedia saat operasi sedang dijalankan dan versi baru fungsi sedang dikompilasi.

Untuk konstruksi T-SQL yang didukung, lihat Fitur yang Didukung untuk Modul T-SQL yang Dikompilasi Secara Asli.

Membuat, Menghilangkan, dan Mengubah Fungsi yang Ditentukan Pengguna

Anda menggunakan CREATE FUNCTION untuk membuat fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar, DROP FUNCTION untuk menghapus fungsi yang ditentukan pengguna, dan ALTER FUNCTION untuk mengubah fungsi. BEGIN ATOMIC WITH diperlukan untuk fungsi yang ditentukan pengguna.

Untuk informasi tentang sintaks yang didukung dan batasan apa pun, lihat topik berikut.

Prosedur tersimpan sp_recompile (Transact-SQL) dapat digunakan dengan fungsi skalar yang ditentukan pengguna dan dikompilasi secara native. Ini akan mengakibatkan fungsi dikompresi ulang menggunakan definisi yang ada dalam metadata.

Sampel berikut menunjukkan UDF skalar dari database sampel AdventureWorks2022 .

CREATE FUNCTION [dbo].[ufnLeadingZeros_native](@Value int)   
RETURNS varchar(8)   
WITH NATIVE_COMPILATION, SCHEMABINDING  
AS   
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')  
  
    DECLARE @ReturnValue varchar(8);  
    SET @ReturnValue = CONVERT(varchar(8), @Value);  
       DECLARE @i int = 0, @count int = 8 - LEN(@ReturnValue)  
  
    WHILE @i < @count  
       BEGIN  
            SET @ReturnValue = '0' + @ReturnValue;  
            SET @i += 1  
       END  
  
    RETURN (@ReturnValue);  
  
END  

Memanggil Fungsi yang Ditentukan Pengguna

Fungsi skalar yang ditentukan pengguna dan dikompilasi secara native dapat digunakan dalam ekspresi, di posisi yang sama seperti fungsi skalar bawaan dan fungsi skalar yang ditentukan pengguna yang diinterpretasikan. Fungsi skalar yang ditentukan pengguna yang dikompilasi secara native juga dapat digunakan dengan pernyataan EXECUTE, dalam pernyataan Transact-SQL, dan dalam prosedur tersimpan yang dikompilasi secara native.

Anda dapat menggunakan fungsi yang ditentukan pengguna skalar ini dalam prosedur penyimpanan yang dikompilasi secara asli dan fungsi yang ditentukan pengguna yang dikompilasi secara asli, dan di mana pun fungsi bawaan diizinkan. Anda juga dapat menggunakan fungsi skalar yang ditentukan pengguna dan dikompilasi secara native dalam modul Transact-SQL tradisional.

Anda dapat menggunakan fungsi skalar yang ditentukan pengguna ini dalam mode interop, di mana saja fungsi skalar yang ditentukan pengguna dan diinterpretasikan dapat digunakan. Penggunaan ini tunduk pada batasan transaksi lintas kontainer, sebagaimana dijelaskan dalam bagian Tingkat Isolasi yang Didukung untuk Transaksi Lintas Kontainer di Transaksi dengan Tabel yang Dioptimalkan untuk Memori. Untuk informasi selengkapnya tentang mode interop, lihat Mengakses Tabel yang Dioptimalkan untuk Memori Menggunakan Transact-SQL Terinterpretasi.

Fungsi skalar yang ditentukan pengguna dan dikompilasi secara native memang memerlukan konteks eksekusi yang eksplisit. Untuk informasi selengkapnya, lihat EXECUTE AS Klausul (Transact-SQL). EXECUTE AS PENELEPON tidak didukung. Untuk informasi selengkapnya, lihat EXECUTE (Transact-SQL).

Untuk sintaks yang didukung untuk pernyataan Transact-SQL Execute, untuk fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar, lihat EXECUTE (Transact-SQL). Untuk sintaks yang didukung untuk menjalankan fungsi yang ditentukan pengguna dalam prosedur tersimpan yang dikompilasi secara asli, lihat Fitur yang Didukung untuk Modul T-SQL yang Dikompilasi Secara Asli.

Petunjuk dan Parameter

Dukungan untuk petunjuk tabel, join, dan kueri di dalam fungsi skalar yang ditentukan pengguna dan dikompilasi secara native setara dengan dukungan untuk petunjuk ini pada prosedur tersimpan yang dikompilasi secara native. Seperti fungsi yang ditentukan pengguna skalar yang ditafsirkan, petunjuk kueri yang disertakan dengan kueri Transact-SQL yang mereferensikan fungsi yang dikompilasi secara asli dan ditentukan pengguna skalar tidak memengaruhi rencana kueri untuk fungsi yang ditentukan pengguna ini.

Parameter yang didukung untuk fungsi skalar yang ditentukan pengguna dan dikompilasi secara native adalah semua parameter yang didukung untuk prosedur tersimpan yang dikompilasi secara native, selama parameter tersebut diizinkan untuk fungsi skalar yang ditentukan pengguna. Contoh parameter yang didukung adalah parameter bernilai tabel.

Terikat pada Skema

Berikut ini berlaku untuk fungsi skalar yang ditentukan pengguna dan dikompilasi secara native.

  • Harus terikat skema, dengan menggunakan argumen WITH SCHEMABINDING di CREATE FUNCTION dan ALTER FUNCTION.

  • Tidak dapat dihilangkan atau diubah saat direferensikan oleh prosedur tersimpan terikat skema atau fungsi yang ditentukan pengguna.

SHOWPLAN_XML

Fungsi skalar yang ditentukan pengguna dan dikompilasi secara native mendukung SHOWPLAN_XML. Ini sesuai dengan skema umum SHOWPLAN_XML , seperti halnya prosedur tersimpan yang dikompilasi secara asli. Elemen dasar untuk fungsi yang ditentukan pengguna adalah <UDF>.

STATISTICS XML tidak didukung untuk fungsi skalar yang ditentukan pengguna dan dikompilasi secara native. Saat Anda menjalankan kueri yang mereferensikan fungsi yang ditentukan pengguna, dengan STATISTICS XML diaktifkan, konten XML dikembalikan tanpa bagian untuk fungsi yang ditentukan pengguna.

Izin

Seperti halnya prosedur tersimpan yang dikompilasi secara native, izin untuk objek yang dirujuk oleh fungsi skalar yang ditentukan pengguna dan dikompilasi secara native diperiksa saat fungsi tersebut dibuat. CREATE FUNCTION gagal jika pengguna yang diimpersonasi tidak memiliki izin yang diperlukan. Jika perubahan izin mengakibatkan pengguna yang ditiru tidak lagi memiliki izin yang benar, eksekusi berikutnya dari fungsi yang ditentukan pengguna gagal.

Saat Anda menggunakan fungsi skalar yang ditentukan pengguna dan dikompilasi secara native di dalam prosedur tersimpan yang dikompilasi secara native, izin untuk menjalankan fungsi yang ditentukan pengguna tersebut diperiksa saat prosedur terluar dibuat. Jika pengguna yang ditiru oleh prosedur luar tidak memiliki izin EXEC untuk fungsi yang ditentukan pengguna, pembuatan prosedur tersimpan gagal. Jika perubahan izin mengakibatkan pengguna tidak lagi memiliki izin EXEC, eksekusi prosedur luar gagal.

Lihat Juga

Fungsi Bawaan (Transact-SQL)
Menyimpan Rencana Eksekusi dalam Format XML