Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:Titik akhir analitik SQL dan Gudang di Microsoft Fabric
CREATE FUNCTION dapat membuat fungsi nilai tabel sebaris dan fungsi skalar.
Catatan
UDF skalar adalah fitur pratinjau di Fabric Data Warehouse.
Penting
Di Fabric Data Warehouse, UDF skalar harus sebaris untuk digunakan dengan SELECT ... FROM kueri pada tabel pengguna, tetapi Anda masih dapat membuat fungsi yang tidak sebaris. UDF skalar yang tidak sebaris bekerja dalam jumlah skenario terbatas. Anda dapat memeriksa apakah UDF dapat di-inlin.
Fungsi yang ditentukan pengguna adalah rutinitas Transact-SQL yang menerima parameter, melakukan tindakan, seperti perhitungan kompleks, dan mengembalikan hasil tindakan tersebut sebagai nilai. Fungsi skalar mengembalikan nilai skalar, seperti angka atau string. Fungsi bernilai tabel (TVF) yang ditentukan pengguna mengembalikan tabel.
Gunakan CREATE FUNCTION untuk membuat rutinitas T-SQL yang dapat digunakan kembali yang dapat digunakan dengan cara berikut:
- Dalam pernyataan Transact-SQL seperti
SELECT - Dalam Transact-SQL pernyataan manipulasi data (DML) seperti
UPDATE, ,INSERTdanDELETE - Dalam aplikasi yang memanggil fungsi
- Dalam definisi fungsi lain yang ditentukan pengguna
- Untuk mengganti prosedur tersimpan
Petunjuk / Saran
Anda dapat menentukan CREATE OR ALTER FUNCTION untuk membuat fungsi baru jika tidak ada dengan nama tersebut, atau mengubah fungsi yang ada, dalam satu pernyataan.
Sintaks
Sintaks fungsi skalar
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Sintaks fungsi bernilai tabel sebaris
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Argumen
schema_name
Nama skema tempat fungsi yang ditentukan pengguna berada.
function_name
Nama fungsi yang ditentukan pengguna. Nama fungsi harus mematuhi aturan untuk pengidentifikasi dan harus unik dalam database dan skemanya.
Catatan
Tanda kurung diperlukan setelah nama fungsi meskipun parameter tidak ditentukan.
@ parameter_name
Parameter dalam fungsi yang ditentukan pengguna. Satu atau beberapa parameter dapat dideklarasikan.
Fungsi dapat memiliki maksimum 2.100 parameter. Nilai setiap parameter yang dideklarasikan harus disediakan oleh pengguna ketika fungsi dijalankan, kecuali default untuk parameter ditentukan.
Tentukan nama parameter dengan menggunakan tanda (@) sebagai karakter pertama. Nama parameter harus mematuhi aturan untuk pengidentifikasi. Parameter bersifat lokal untuk fungsi; nama parameter yang sama dapat digunakan dalam fungsi lain. Parameter hanya dapat menggantikan konstanta; mereka tidak dapat digunakan alih-alih nama tabel, nama kolom, atau nama objek database lainnya.
Catatan
ANSI_WARNINGS tidak dihormati ketika Anda meneruskan parameter dalam prosedur tersimpan, fungsi yang ditentukan pengguna, atau ketika Anda mendeklarasikan dan mengatur variabel dalam pernyataan batch. Misalnya, jika variabel didefinisikan sebagai karakter(3), lalu diatur ke nilai yang lebih besar dari tiga karakter, data dipotong ke ukuran yang ditentukan dan pernyataan INSERT atau UPDATE berhasil.
parameter_data_type
Jenis data parameter. Untuk fungsi Transact-SQL, semua jenis data skalar yang didukung diizinkan.
[ = default ]
Nilai default untuk parameter. Jika nilai default ditentukan, fungsi dapat dijalankan tanpa menentukan nilai untuk parameter tersebut.
Ketika parameter fungsi memiliki nilai default, kata kunci DEFAULT harus ditentukan saat fungsi dipanggil untuk mengambil nilai default. Perilaku ini berbeda dari menggunakan parameter dengan nilai default dalam prosedur tersimpan di mana menghilangkan parameter juga menyiratkan nilai default.
return_data_type
Nilai yang dikembalikan dari fungsi skalar yang ditentukan pengguna.
Untuk fungsi di Fabric Data Warehouse, semua jenis data diizinkan kecuali untuktanda waktu/. Jenis nonskala seperti tabel tidak diperbolehkan.
function_body
Serangkaian pernyataan Transact-SQL.
Dalam fungsi skalar, function_body adalah serangkaian pernyataan Transact-SQL yang bersama-sama mengevaluasi ke nilai skalar, yang dapat mencakup:
- Ekspresi pernyataan tunggal
- Ekspresi multi-pernyataan (
IF/THEN/ELSEdanBEGIN/ENDblok) - Variabel lokal
- Panggilan ke fungsi SQL bawaan tersedia
- Panggilan ke UDF lain
-
SELECTpernyataan, dan referensi ke tabel, tampilan, dan fungsi bernilai tabel sebaris
scalar_expression
Menentukan nilai skalar yang dikembalikan fungsi skalar.
select_stmt
Pernyataan tunggal SELECT yang menentukan nilai pengembalian fungsi bernilai tabel sebaris. Untuk fungsi bernilai tabel sebaris, tidak ada isi fungsi; tabel adalah kumpulan hasil dari satu SELECT pernyataan.
tabel
Menentukan bahwa nilai pengembalian fungsi bernilai tabel (TVF) adalah tabel. Hanya konstanta dan @local_variables yang dapat diteruskan ke TVF.
Dalam TVF sebaris (pratinjau), nilai pengembalian TABLE didefinisikan melalui satu SELECT pernyataan. Fungsi sebaris tidak memiliki variabel pengembalian terkait.
<function_option>
Di Fabric Data Warehouse, INLINEkata kunci , ENCRYPTION, dan EXECUTE AS tidak didukung.
Opsi fungsi yang didukung meliputi:
SCHEMABINDING
Menentukan bahwa fungsi terikat ke objek database yang dirujuknya. Ketika SCHEMABINDING ditentukan, objek dasar tidak dapat dimodifikasi dengan cara yang akan memengaruhi definisi fungsi. Definisi fungsi itu sendiri harus terlebih dahulu dimodifikasi atau dihilangkan untuk menghapus dependensi pada objek yang akan dimodifikasi.
Pengikatan fungsi ke objek yang dirujuknya dihapus hanya ketika salah satu tindakan berikut terjadi:
Fungsi dihilangkan.
Fungsi ini dimodifikasi dengan menggunakan pernyataan ALTER dengan opsi SCHEMABINDING yang tidak ditentukan.
Fungsi dapat terikat skema hanya jika kondisi berikut benar:
Setiap fungsi yang ditentukan pengguna yang dirujuk oleh fungsi juga terikat skema.
Objek yang direferensikan oleh fungsi direferensikan menggunakan nama dua bagian.
Hanya fungsi bawaan dan UDF lain dalam database yang sama yang dapat dirujuk dalam isi UDF.
Pengguna yang menjalankan
CREATE FUNCTIONpernyataan memiliki izin REFERENCES pada objek database yang dirujuk fungsi.
Untuk menghapus SCHEMABINDING, gunakan ALTER.
MENGEMBALIKAN NULL PADA INPUT NULL | DIPANGGIL PADA INPUT NULL
OnNULLCall Menentukan atribut fungsi bernilai skalar. Jika tidak ditentukan, CALLED ON NULL INPUT tersirat secara default, dan isi fungsi dijalankan meskipun NULL diteruskan sebagai argumen.
Praktik terbaik
Jika fungsi yang ditentukan pengguna tidak dibuat dengan skemabinding, perubahan yang dilakukan pada objek yang mendasar dapat memengaruhi definisi fungsi dan menghasilkan hasil yang tidak terduga saat dipanggil. Disarankan untuk menentukan
WITH SCHEMABINDINGklausul saat Anda membuat fungsi. Ini memastikan bahwa objek yang dirujuk dalam definisi fungsi tidak dapat dimodifikasi kecuali fungsi juga dimodifikasi.Menulis fungsi yang ditentukan pengguna Anda agar sebaris. Untuk informasi selengkapnya, lihat Scalar UDF inlining.
Interoperabilitas
Fungsi yang ditentukan pengguna bernilai tabel sebaris
Dalam fungsi bernilai tabel sebaris, hanya satu pernyataan pilihan yang diizinkan.
Fungsi skalar yang ditentukan pengguna
Pernyataan berikut valid dalam fungsi bernilai skalar:
- Pernyataan tugas
- Pernyataan Control-of-Flow kecuali
TRY...CATCHpernyataan -
DECLAREpernyataan yang menentukan variabel data lokal
Fungsi bawaan berikut ini tidak didukung dalam isi fungsi bernilai skalar:
UDF skalar tidak dapat digunakan dalam
SELECT ... FROMkueri pada tabel pengguna saat:- Isi UDF berisi panggilan ke fungsi bawaan nondeterministik, lihat Fungsi deterministik dan nondeterministik.
- Isi UDF berisi ekspresi tabel umum (CTE).
- Isi UDF berisi badan UDF multi-pernyataan di luar enam
IF-THEN-ELSEblok. - Isi UDF berisi WHILE LOOP
- Tubuh UDF tidak dapat di-inlin karena alasan lain. Untuk informasi selengkapnya, lihat Persyaratan inlining UDF skalar.
UDF skalar tidak dapat digunakan dalam kueri saat:
- UDF secara langsung dipanggil dalam
GROUP BYklausul. - UDF secara langsung dipanggil dalam klausul
ORDER BY. - kueri panggilan memiliki ekspresi tabel umum (CTE).
- UDF secara langsung dipanggil dalam
UDF skalar rekursif tidak didukung.
Kueri pengguna dapat gagal jika lebih dari 10 panggilan UDF dilakukan dalam satu kueri.
Dalam beberapa kasus tepi, kompleksitas kueri pengguna dan isi UDF mencegah inlining, dalam hal ini UDF skalar tidak sebaris, dan kueri pengguna gagal.
Ketika UDF skalar digunakan dalam skenario yang tidak didukung, Anda akan melihat pesan kesalahan "
Scalar UDF execution is currently unavailable in this context."
Batasan
Catatan
Selama pratinjau saat ini, batasan dapat berubah.
Fungsi yang ditentukan pengguna tidak dapat digunakan untuk melakukan tindakan yang mengubah status database.
Fungsi yang ditentukan pengguna dapat ditumpuk; artinya, satu fungsi yang ditentukan pengguna dapat memanggil fungsi lain. Tingkat berlapis bertahpa ketika fungsi yang disebut memulai eksekusi, dan dikurangi ketika fungsi yang dipanggil menyelesaikan eksekusi. Fungsi yang ditentukan pengguna di Fabric Data Warehouse dapat ditumpuk hingga empat tingkat ketika isi UDF mereferensikan fungsi tabel/tampilan/bernilai tabel sebaris, atau hingga 32 tingkat jika tidak. Melebihi tingkat maksimum bersarang menyebabkan rantai fungsi panggilan gagal.
Metainformasi
Bagian ini mencantumkan tampilan katalog sistem yang dapat Anda gunakan untuk mengembalikan metadata tentang fungsi yang ditentukan pengguna.
sys.sql_modules: Menampilkan definisi fungsi Transact-SQL yang ditentukan pengguna. Contohnya:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');sys.parameters: Menampilkan informasi tentang parameter yang ditentukan dalam fungsi yang ditentukan pengguna.
sys.sql_expression_dependencies: Menampilkan objek yang mendasar yang direferensikan oleh fungsi.
Izin
Anggota peran Administrator, Anggota, dan Kontributor ruang kerja Fabric dapat membuat fungsi.
Inlining UDF skalar
Microsoft Fabric Data Warehouse menggunakan inlining UDF skalar untuk mengkompilasi dan menjalankan kode yang ditentukan pengguna secara terdistribusi. Inlining UDF skalar diaktifkan secara default.
Sementara skalar UDF inlining adalah teknik pengoptimalan performa yang pertama kali diperkenalkan di Microsoft SQL Server 2019 (15.0), di Fabric Data Warehouse menentukan serangkaian skenario yang didukung. Di Gudang Data Fabric, UDF skalar secara otomatis diubah menjadi ekspresi skalar atau subkueri skalar yang digantikan dalam kueri panggilan sebagai pengganti operator UDF.
Beberapa sintaks T-SQL membuat UDF skalar tidak dapat dibariskan. Fungsi yang berisi perulangan WHILE , beberapa RETURN pernyataan, atau panggilan ke fungsi bawaan SQL nondeterministik (seperti GETUTCDATE() atau GETDATE()) tidak dapat di-inlin. Untuk informasi selengkapnya, lihat Persyaratan inlining UDF skalar.
Periksa apakah UDF skalar dapat di-inlin
Tampilan sys.sql_modules katalog menyertakan kolom is_inlineable, yang menunjukkan apakah UDF sebaris.
Properti is_inlineable berasal dari memeriksa sintaks di dalam definisi UDF. UDF skalar tidak di-inlin sebelum waktu kompilasi. Nilai 1 menunjukkan bahwa UDF sebaris, sementara nilai 0 menunjukkan bahwa UDF tidak sebaris. Jika UDF skalar tidak sebaris, UDF tidak menjaminnya akan selalu di-inlin saat kueri dikompilasi.
Fabric Data Warehouse memutuskan (per kueri) apakah akan menginline UDF, tergantung pada kompleksitas kueri secara keseluruhan.
Gunakan kueri sampel berikut untuk memeriksa apakah UDF skalar tidak sebaris:
SELECT
SCHEMA_NAME(b.schema_id) as function_schema_name,
b.name as function_name,
b.type_desc as function_type,
a.is_inlineable
FROM sys.sql_modules AS a
INNER JOIN sys.objects AS b
ON a.object_id = b.object_id
WHERE b.type IN ('FN');
Jika fungsi skalar tidak sebaris dalam sys.sql_modules.is_inlineable, Anda masih dapat menjalankan kueri sebagai panggilan mandiri, misalnya, untuk mengatur variabel. Tetapi fungsi skalar tidak dapat menjadi bagian SELECT ... FROM dari kueri pada tabel pengguna. Contohnya:
CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
RETURNS datetime2(6)
AS
BEGIN
RETURN SYSUTCDATETIME();
END
Fungsi sampel dbo.custom_SYSUTCDATETIME skalar yang ditentukan pengguna tidak sebaris karena penggunaan fungsi sistem yang tidak ditentukan, SYSUTCDATETIME(). Ini akan gagal ketika digunakan dalam SELECT ... FROM kueri pada tabel pengguna, tetapi akan berhasil sebagai panggilan mandiri, misalnya:
DECLARE @utcdate datetime2(7);
SET @utcdate = dbo.custom_SYSUTCDATETIME();
SELECT @utcdate as 'utc_date';
Contoh
J. Membuat fungsi bernilai tabel sebaris
Contoh berikut membuat fungsi bernilai tabel sebaris untuk mengembalikan beberapa informasi utama pada modul, pemfilteran menurut objectType parameter. Ini termasuk nilai default untuk mengembalikan semua modul ketika fungsi dipanggil dengan DEFAULT parameter . Contoh ini menggunakan beberapa tampilan katalog sistem yang disebutkan dalam Metadata.
CREATE FUNCTION dbo.ModulesByType (@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN (
SELECT sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.DEFINITION AS 'Module Description',
sm.is_inlineable AS 'Inlineable'
FROM sys.sql_modules AS sm
INNER JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type LIKE '%' + @objectType + '%'
);
GO
Fungsi kemudian dapat dipanggil untuk mengembalikan semua fungsi bernilai tabel sebaris (IF) dengan:
SELECT * FROM dbo.ModulesByType('IF'); -- SQL_INLINE_TABLE_VALUED_FUNCTION
Atau, temukan semua fungsi skalar (FN):
SELECT * FROM dbo.ModulesByType('FN'); -- SQL_SCALAR_FUNCTION
B. Menggabungkan hasil fungsi bernilai tabel sebaris
Contoh sederhana ini menggunakan TVF sebaris yang dibuat sebelumnya untuk menunjukkan bagaimana hasilnya dapat dikombinasikan dengan tabel lain menggunakan penerapan silang. Di sini, kita memilih semua kolom dari keduanya sys.objects dan hasil ModulesByType untuk semua baris yang cocok pada type kolom. Untuk informasi selengkapnya tentang menggunakan terapkan, lihat klausa FROM ditambah JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects AS o
CROSS APPLY dbo.ModulesByType(o.type);
GO
C. Membuat fungsi UDF skalar
Contoh berikut membuat UDF skalar sebaris yang menutupi teks input.
CREATE OR ALTER FUNCTION [dbo].[cleanInput] (@InputString VARCHAR(100))
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @Result VARCHAR(50)
DECLARE @CleanedInput VARCHAR(50)
-- Trim whitespace
SET @CleanedInput = LTRIM(RTRIM(@InputString))
-- Handle empty or null input
IF @CleanedInput = '' OR @CleanedInput IS NULL
BEGIN
SET @Result = ''
END
ELSE IF LEN(@CleanedInput) <= 2
BEGIN
-- If string length is 1 or 2, just return the cleaned string
SET @Result = @CleanedInput
END
ELSE
BEGIN
-- Construct the masked string
SET @Result =
LEFT(@CleanedInput, 1) +
REPLICATE('*', LEN(@CleanedInput) - 2) +
RIGHT(@CleanedInput, 1)
END
RETURN @Result
END
Anda dapat memanggil fungsi seperti ini:
DECLARE @input varchar(100) = '123456789'
SELECT dbo.cleanInput (@input) AS function_output;
Contoh selengkapnya tentang bagaimana Anda dapat menggunakan UDF skalar di Fabric Data Warehouse:
Dalam pernyataan SELECT :
SELECT TOP 10
t.id, t.name,
dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t;
WHERE Dalam klausa:
SELECT t.id, t.name, dbo.cleanInput(t.name) AS function_output
FROM dbo.MyTable AS t
WHERE dbo.cleanInput(t.name)='myvalue'
JOIN Dalam klausa:
SELECT t1.id, t1.name,
dbo.cleanInput (t1.name) AS function_output,
dbo.cleanInput (t2.name) AS function_output_2
FROM dbo.MyTable1 AS t1
INNER JOIN dbo.MyTable2 AS t2
ON dbo.cleanInput(t1.name)=dbo.cleanInput(t2.name);
ORDER BY Dalam klausa:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
FROM dbo.MyTable AS t
ORDER BY function_output;
Dalam pernyataan bahasa manipulasi data (DML) seperti INSERT, , UPDATEatau DELETE:
SELECT t.id, t.name, dbo.cleanInput (t.name) AS function_output
INTO dbo.MyTable_new
FROM dbo.MyTable AS t;
UPDATE t
SET t.mycolumn_new = dbo.cleanInput (t.name)
FROM dbo.MyTable AS t;
DELETE t
FROM dbo.MyTable AS t
WHERE dbo.cleanInput (t.name) ='myvalue';
Konten terkait
Berlaku untuk:Azure Synapse Analytics Analytics
Platform System (PDW)
Membuat fungsi yang ditentukan pengguna (UDF) di Azure Synapse Analytics atau Analytics Platform System (PDW). Fungsi yang ditentukan pengguna adalah rutinitas Transact-SQL yang menerima parameter, melakukan tindakan, seperti perhitungan kompleks, dan mengembalikan hasil tindakan tersebut sebagai nilai. Fungsi bernilai tabel (TVF) yang ditentukan pengguna mengembalikan jenis data tabel.
Petunjuk / Saran
Untuk sintaks di Fabric Data Warehouse, lihat versi CREATE FUNCTION untuk Fabric Data Warehouse.
Di Analytics Platform System (PDW), nilai yang dikembalikan harus berupa nilai skalar (tunggal).
Di Azure Synapse Analytics,
CREATE FUNCTIONdapat mengembalikan tabel dengan menggunakan sintaks untuk fungsi bernilai tabel sebaris (pratinjau) atau dapat mengembalikan satu nilai dengan menggunakan sintaks untuk fungsi skalar.Di kumpulan SQL tanpa server di Azure Synapse Analytics,
CREATE FUNCTIONdapat membuat fungsi nilai tabel sebaris tetapi bukan fungsi skalar.Gunakan pernyataan ini untuk membuat rutinitas yang dapat digunakan kembali yang dapat digunakan dengan cara berikut:
Dalam pernyataan Transact-SQL seperti
SELECTDalam aplikasi yang memanggil fungsi
Dalam definisi fungsi lain yang ditentukan pengguna
Untuk menentukan batasan CHECK pada kolom
Untuk mengganti prosedur tersimpan
Menggunakan fungsi sebaris sebagai predikat filter untuk kebijakan keamanan
Sintaks
Sintaks fungsi skalar
-- Transact-SQL Scalar Function Syntax (in dedicated pools in Azure Synapse Analytics and Parallel Data Warehouse)
-- Not available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS return_data_type
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
[ ; ]
<function_option>::=
{
[ SCHEMABINDING ]
| [ RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT ]
}
Sintaks fungsi bernilai tabel sebaris
-- Transact-SQL Inline Table-Valued Function Syntax
-- Preview in dedicated SQL pools in Azure Synapse Analytics
-- Available in the serverless SQL pools in Azure Synapse Analytics
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] parameter_data_type
[ = default ] }
[ ,...n ]
]
)
RETURNS TABLE
[ WITH SCHEMABINDING ]
[ AS ]
RETURN [ ( ] select_stmt [ ) ]
[ ; ]
Argumen
schema_name
Nama skema tempat fungsi yang ditentukan pengguna berada.
function_name
Nama fungsi yang ditentukan pengguna. Nama fungsi harus mematuhi aturan untuk pengidentifikasi dan harus unik dalam database dan skemanya.
Catatan
Tanda kurung diperlukan setelah nama fungsi meskipun parameter tidak ditentukan.
@ parameter_name
Parameter dalam fungsi yang ditentukan pengguna. Satu atau beberapa parameter dapat dideklarasikan.
Fungsi dapat memiliki maksimum 2.100 parameter. Nilai setiap parameter yang dideklarasikan harus disediakan oleh pengguna ketika fungsi dijalankan, kecuali default untuk parameter ditentukan.
Tentukan nama parameter dengan menggunakan tanda (@) sebagai karakter pertama. Nama parameter harus mematuhi aturan untuk pengidentifikasi. Parameter bersifat lokal untuk fungsi; nama parameter yang sama dapat digunakan dalam fungsi lain. Parameter hanya dapat menggantikan konstanta; mereka tidak dapat digunakan alih-alih nama tabel, nama kolom, atau nama objek database lainnya.
Catatan
ANSI_WARNINGS tidak dihormati ketika Anda meneruskan parameter dalam prosedur tersimpan, fungsi yang ditentukan pengguna, atau ketika Anda mendeklarasikan dan mengatur variabel dalam pernyataan batch. Misalnya, jika variabel didefinisikan sebagai karakter(3), lalu diatur ke nilai yang lebih besar dari tiga karakter, data dipotong ke ukuran yang ditentukan dan pernyataan INSERT atau UPDATE berhasil.
parameter_data_type
Jenis data parameter. Untuk fungsi Transact-SQL, semua jenis data skalar yang didukung di Azure Synapse Analytics diizinkan. Jenis data tanda waktu (rowversion) bukan jenis yang didukung.
[ = default ]
Nilai default untuk parameter. Jika nilai default ditentukan, fungsi dapat dijalankan tanpa menentukan nilai untuk parameter tersebut.
Ketika parameter fungsi memiliki nilai default, kata kunci DEFAULT harus ditentukan ketika fungsi dipanggil untuk mengambil nilai default. Perilaku ini berbeda dari menggunakan parameter dengan nilai default dalam prosedur tersimpan di mana menghilangkan parameter juga menyiratkan nilai default.
return_data_type
Nilai yang dikembalikan dari fungsi skalar yang ditentukan pengguna. Untuk fungsi Transact-SQL, semua jenis data skalar yang didukung di Azure Synapse Analytics diizinkan. Jenis data tanda waktu rowversion/bukan jenis yang didukung. Jenis kursor dan tabel nonscalar tidak diperbolehkan.
function_body
Serangkaian pernyataan Transact-SQL.
function_body tidak boleh berisi SELECT pernyataan dan tidak dapat mereferensikan data database.
function_body tidak dapat mereferensikan tabel atau tampilan. Isi fungsi dapat memanggil fungsi deterministik lainnya tetapi tidak dapat memanggil fungsi nondeterministik.
Dalam fungsi skalar, function_body adalah serangkaian pernyataan Transact-SQL yang bersama-sama mengevaluasi ke nilai skalar.
scalar_expression
Menentukan nilai skalar yang dikembalikan fungsi skalar.
select_stmt
Pernyataan tunggal SELECT yang menentukan nilai pengembalian fungsi bernilai tabel sebaris. Untuk fungsi bernilai tabel sebaris, tidak ada isi fungsi; tabel adalah kumpulan hasil dari satu SELECT pernyataan.
tabel
Menentukan bahwa nilai pengembalian fungsi bernilai tabel (TVF) adalah tabel. Hanya konstanta dan @local_variables yang dapat diteruskan ke TVF.
Dalam TVF sebaris (pratinjau), nilai pengembalian TABLE didefinisikan melalui satu SELECT pernyataan. Fungsi sebaris tidak memiliki variabel pengembalian terkait.
<function_option>
Menentukan bahwa fungsi memiliki satu atau beberapa opsi berikut.
SCHEMABINDING
Menentukan bahwa fungsi terikat ke objek database yang dirujuknya. Ketika SCHEMABINDING ditentukan, objek dasar tidak dapat dimodifikasi dengan cara yang akan memengaruhi definisi fungsi. Definisi fungsi itu sendiri harus terlebih dahulu dimodifikasi atau dihilangkan untuk menghapus dependensi pada objek yang akan dimodifikasi.
Pengikatan fungsi ke objek yang dirujuknya dihapus hanya ketika salah satu tindakan berikut terjadi:
Fungsi dihilangkan.
Fungsi ini dimodifikasi dengan menggunakan pernyataan ALTER dengan opsi SCHEMABINDING yang tidak ditentukan.
Fungsi dapat terikat skema hanya jika kondisi berikut benar:
Setiap fungsi yang ditentukan pengguna yang dirujuk oleh fungsi juga terikat skema.
Fungsi dan UDF lain yang dirujuk oleh fungsi dirujuk menggunakan nama satu bagian atau dua bagian.
Hanya fungsi bawaan dan UDF lain dalam database yang sama yang dapat dirujuk dalam isi UDF.
Pengguna yang menjalankan
CREATE FUNCTIONpernyataan memiliki izin REFERENCES pada objek database yang dirujuk fungsi.
Untuk menghapus SCHEMABINDING, gunakan ALTER.
MENGEMBALIKAN NULL PADA INPUT NULL | DIPANGGIL PADA INPUT NULL
OnNULLCall Menentukan atribut fungsi bernilai skalar. Jika tidak ditentukan, CALLED ON NULL INPUT tersirat secara default, dan isi fungsi dijalankan meskipun NULL diteruskan sebagai argumen.
Praktik terbaik
Jika fungsi yang ditentukan pengguna tidak dibuat dengan klausa SCHEMABINDING, perubahan yang dilakukan pada objek yang mendasar dapat memengaruhi definisi fungsi dan menghasilkan hasil yang tidak terduga saat dipanggil. Disarankan untuk menentukan WITH SCHEMABINDING klausul saat Anda membuat fungsi. Ini memastikan bahwa objek yang dirujuk dalam definisi fungsi tidak dapat dimodifikasi kecuali fungsi juga dimodifikasi.
Interoperabilitas
Pernyataan berikut valid dalam fungsi bernilai skalar:
Pernyataan penugasan.
Pernyataan Control-of-Flow kecuali TRY... Pernyataan CATCH.
Pernyataan DECLARE yang mendefinisikan variabel data lokal.
Dalam fungsi bernilai tabel sebaris (pratinjau), hanya satu pernyataan pilih yang diizinkan.
Batasan
Fungsi yang ditentukan pengguna tidak dapat digunakan untuk melakukan tindakan yang mengubah status database.
Fungsi yang ditentukan pengguna dapat ditumpuk; artinya, satu fungsi yang ditentukan pengguna dapat memanggil fungsi lain. Tingkat berlapis bertahpa ketika fungsi yang disebut memulai eksekusi, dan dikurangi ketika fungsi yang dipanggil menyelesaikan eksekusi. Melebihi tingkat maksimum bersarang menyebabkan seluruh rantai fungsi panggilan gagal.
Objek, termasuk fungsi, tidak dapat dibuat dalam master database kumpulan SQL tanpa server Anda di Azure Synapse Analytics.
Metainformasi
Bagian ini mencantumkan tampilan katalog sistem yang dapat Anda gunakan untuk mengembalikan metadata tentang fungsi yang ditentukan pengguna.
sys.sql_modules: Menampilkan definisi fungsi Transact-SQL yang ditentukan pengguna. Contohnya:
SELECT definition, type FROM sys.sql_modules AS m JOIN sys.objects AS o ON m.object_id = o.object_id AND type = ('FN');sys.parameters: Menampilkan informasi tentang parameter yang ditentukan dalam fungsi yang ditentukan pengguna.
sys.sql_expression_dependencies: Menampilkan objek yang mendasar yang direferensikan oleh fungsi.
Izin
Memerlukan izin CREATE FUNCTION dalam database dan izin UBAH pada skema tempat fungsi sedang dibuat.
Contoh
J. Menggunakan fungsi bernilai skalar yang ditentukan pengguna untuk mengubah jenis data
Fungsi sederhana ini mengambil jenis data int sebagai input, dan mengembalikan jenis data desimal (10,2) sebagai output.
CREATE FUNCTION dbo.ConvertInput (@MyValueIn int)
RETURNS decimal(10,2)
AS
BEGIN
DECLARE @MyValueOut int;
SET @MyValueOut= CAST( @MyValueIn AS decimal(10,2));
RETURN(@MyValueOut);
END;
GO
SELECT dbo.ConvertInput(15) AS 'ConvertedValue';
Catatan
Fungsi skalar tidak tersedia di kumpulan SQL tanpa server.
B. Membuat fungsi bernilai tabel sebaris
Contoh berikut membuat fungsi bernilai tabel sebaris untuk mengembalikan beberapa informasi utama pada modul, pemfilteran menurut objectType parameter. Ini termasuk nilai default untuk mengembalikan semua modul ketika fungsi dipanggil dengan DEFAULT parameter . Contoh ini menggunakan beberapa tampilan katalog sistem yang disebutkan dalam Metadata.
CREATE FUNCTION dbo.ModulesByType(@objectType CHAR(2) = '%%')
RETURNS TABLE
AS
RETURN
(
SELECT
sm.object_id AS 'Object Id',
o.create_date AS 'Date Created',
OBJECT_NAME(sm.object_id) AS 'Name',
o.type AS 'Type',
o.type_desc AS 'Type Description',
sm.definition AS 'Module Description'
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE o.type like '%' + @objectType + '%'
);
GO
Fungsi kemudian dapat dipanggil untuk mengembalikan semua objek tampilan (V) dengan:
select * from dbo.ModulesByType('V');
Catatan
Fungsi nilai tabel sebaris tersedia di kumpulan SQL tanpa server, tetapi dalam pratinjau di kumpulan SQL khusus.
C. Menggabungkan hasil fungsi bernilai tabel sebaris
Contoh sederhana ini menggunakan TVF sebaris yang dibuat sebelumnya untuk menunjukkan bagaimana hasilnya dapat dikombinasikan dengan tabel lain menggunakan penerapan silang. Di sini, kita memilih semua kolom dari keduanya sys.objects dan hasil ModulesByType untuk semua baris yang cocok pada type kolom. Untuk informasi selengkapnya tentang menggunakan terapkan, lihat klausa FROM ditambah JOIN, APPLY, PIVOT (Transact-SQL).
SELECT *
FROM sys.objects o
CROSS APPLY dbo.ModulesByType(o.type);
GO
Catatan
Fungsi nilai tabel sebaris tersedia di kumpulan SQL tanpa server, tetapi dalam pratinjau di kumpulan SQL khusus.