CREATE FUNCTION

Berlaku untuk:Titik akhir analitik SQL di Microsoft Fabric dan Warehouse di Microsoft Fabric

CREATE FUNCTION membuat fungsi bernilai 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 dapat dilinekan bekerja dalam sejumlah 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 Anda gunakan dengan cara berikut:

  • Dalam pernyataan Transact-SQL seperti SELECT
  • Dalam Transact-SQL pernyataan manipulasi data (DML) seperti UPDATE, , INSERTdan DELETE
  • Dalam aplikasi yang memanggil fungsi
  • Dalam definisi fungsi lain yang ditentukan pengguna
  • Untuk mengganti prosedur tersimpan

Anda dapat menentukan CREATE OR ALTER FUNCTION untuk membuat fungsi baru jika tidak ada dengan nama itu, atau mengubah fungsi yang ada, dalam satu pernyataan.

Konvensi sintaks transact-SQL

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 mengikuti aturan untuk pengidentifikasi dan unik dalam database dan skemanya.

Catatan

Anda harus menyertakan tanda kurung setelah nama fungsi meskipun Anda tidak menentukan parameter.

@ parameter_name

Parameter dalam fungsi yang ditentukan pengguna. Anda dapat mendeklarasikan satu atau beberapa parameter.

Sebuah fungsi dapat memiliki hingga 2.100 parameter. Saat pengguna atau aplikasi memanggil fungsi, nilai setiap parameter yang dideklarasikan harus disediakan kecuali default untuk parameter ditentukan.

Tentukan nama parameter dengan menggunakan tanda (@) sebagai karakter pertama. Nama parameter harus mengikuti aturan untuk pengidentifikasi. Parameter bersifat lokal untuk fungsi; Anda dapat menggunakan nama parameter yang sama di fungsi lain. Parameter hanya dapat menggantikan konstanta; Mereka tidak dapat digunakan sebagai pengganti nama tabel, nama kolom, atau nama objek database lainnya.

Catatan

ANSI_WARNINGS tidak dihormati saat Anda meneruskan parameter dalam prosedur tersimpan, fungsi yang ditentukan pengguna, atau saat Anda mendeklarasikan dan mengatur variabel dalam pernyataan batch. Misalnya, jika Anda mendefinisikan variabel sebagai char(3), dan kemudian mengaturnya ke nilai yang lebih besar dari tiga karakter, data dipotong ke ukuran yang ditentukan dan pernyataan SQL berhasil.

parameter_data_type

Jenis data parameter. Untuk fungsi Transact-SQL, semua jenis data skalar yang didukung diizinkan.

[ = default ]

Nilai default untuk parameter. Jika Anda menentukan nilai default , Anda dapat menjalankan fungsi tanpa menentukan nilai untuk parameter tersebut.

Ketika parameter fungsi memiliki nilai default, Anda harus menentukan kata kunci DEFAULT saat memanggil fungsi 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 nonskalar seperti tabel tidak diizinkan.

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/ELSE dan BEGIN/END blok)
  • Variabel lokal
  • Panggilan ke fungsi SQL bawaan tersedia
  • Panggilan ke UDF lain
  • SELECT pernyataan, dan referensi ke tabel, tampilan, dan fungsi bernilai tabel sebaris
  • Pernyataan alur kontrol (WHILE loop, RETURNS)

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.

TABLE

Menentukan bahwa nilai pengembalian fungsi bernilai tabel (TVF) adalah tabel. Anda hanya dapat meneruskan konstanta dan @local_variables ke TVF.

Dalam TVF sebaris (pratinjau), Anda menentukan TABLE nilai yang ditampilkan melalui satu SELECT pernyataan. Fungsi sebaris tidak memiliki variabel pengembalian terkait.

<function_option>

Dalam Fabric Data Warehouse, INLINEkata kunci , ENCRYPTION, dan EXECUTE AS kata kunci tidak didukung.

Opsi fungsi yang didukung meliputi:

SCHEMABINDING

Menentukan bahwa fungsi terikat ke objek database yang dirujuknya. Saat menentukan SCHEMABINDING, Anda tidak dapat memodifikasi objek yang mendasarinya (seperti tampilan atau tabel, misalnya) dengan cara yang memengaruhi definisi fungsi. Anda harus terlebih dahulu memodifikasi atau menghapus definisi fungsi untuk menghapus dependensi pada objek yang ingin Anda modifikasi.

Pengikatan fungsi ke objek yang dirujuknya dihapus hanya ketika salah satu tindakan berikut terjadi:

  • Anda menjatuhkan fungsinya.

  • Anda ALTER pernyataan fungsi dan hapus opsi.SCHEMABINDING

Anda hanya dapat mengikat skema fungsi jika kondisi berikut benar:

  • Setiap fungsi yang ditentukan pengguna yang direferensikan fungsi juga terikat skema.

  • Fungsi mereferensikan objek dengan menggunakan nama dua bagian.

  • Di dalam isi UDF, Anda hanya dapat mereferensikan fungsi bawaan dan UDF lainnya dalam database yang sama.

  • Pengguna yang menjalankan CREATE FUNCTION pernyataan memiliki izin REFERENSI pada objek database yang direferensikan fungsi.

Untuk menghapus SCHEMABINDING, gunakan ALTER.

MENGEMBALIKAN NULL PADA INPUT NULL | DIPANGGIL PADA INPUT NULL

OnNULLCall Menentukan atribut fungsi bernilai skalar. Jika Anda tidak menentukan atribut ini, CALLED ON NULL INPUT tersirat secara default, dan isi fungsi dieksekusi meskipun NULL diteruskan sebagai argumen.

Praktik terbaik

  • Jika Anda tidak membuat fungsi yang ditentukan pengguna dengan pengikatan skema, perubahan pada objek yang mendasarinya dapat memengaruhi definisi fungsi dan menyebabkan hasil yang tidak terduga saat Anda memanggil fungsi. Saat menentukan WITH SCHEMABINDING kapan Anda membuat fungsi, Anda memastikan bahwa perubahan selanjutnya pada objek yang mendasarinya tidak dapat mengubah atau merusak perilaku fungsi.

  • Tulis fungsi yang ditentukan pengguna agar dapat di-inlineable. Untuk informasi selengkapnya, lihat Inlining UDF skalar.

Interoperabilitas

Fungsi yang ditentukan pengguna bernilai tabel sebaris

Fungsi bernilai tabel sebaris hanya menerima satu SELECT pernyataan.

Fungsi skalar yang ditentukan pengguna

Batasan

Catatan

Selama pratinjau saat ini, batasan dapat berubah.

  • Anda tidak dapat menggunakan fungsi yang ditentukan pengguna untuk melakukan tindakan yang memodifikasi status database.

  • Anda dapat menyarangkan fungsi yang ditentukan pengguna. Artinya, satu fungsi yang ditentukan pengguna dapat memanggil fungsi lain. Tingkat bersarang meningkat saat fungsi yang dipanggil memulai eksekusi, dan berkurang saat fungsi yang dipanggil selesai dieksekusi. Dalam Fabric Data Warehouse, Anda dapat menyarangkan fungsi yang ditentukan pengguna hingga empat tingkat saat isi UDF mereferensikan tabel, tampilan, atau fungsi bernilai tabel sebaris, atau hingga 32 tingkat sebaliknya. Jika Anda melebihi tingkat maksimum bersarang, rantai fungsi pemanggilan gagal.

  • UDF skalar tidak dapat digunakan dalam SELECT ... FROM kueri pada tabel pengguna saat:

    • Isi UDF berisi panggilan ke fungsi bawaan nondeterministik (seperti GETDATE()), lihat Fungsi deterministik dan nondeterministik.
    • Isi UDF berisi BREAK atau CONTINUE pernyataan.
    • Ada panggilan UDF skalar rekursif.
  • UDF skalar tidak dapat digunakan dalam semua bentuk kueri, seperti CTE dan GROUP BY ketika:

    • Badan UDF skalar berisi referensi ke tabel/tampilan/iTVF/UDF skalar lainnya.
    • UDF skalar berisi salah satu tipe data ini sebagai parameter input, variabel lokal, atau tipe data pengembalian: varchar(max), nvarchar(max), varbinary(max), binary(max).
    • Tubuh UDF skalar berisi panggilan ke fungsi AI.
    • Dalam skenario di atas, persyaratan inlining udf skalar umum berlaku, lihat Persyaratan inlining UDF skalar.
  • Jika UDF skalar berisi salah satu hal berikut, kueri pengguna dapat gagal jika lebih dari 10 panggilan UDF dilakukan dalam satu kueri:

    • Badan UDF skalar berisi referensi ke tabel/tampilan/iTVF/UDF skalar lainnya.
    • UDF skalar berisi salah satu tipe data ini sebagai parameter input, variabel lokal, atau tipe data pengembalian: varchar(max), nvarchar(max), varbinary(max), binary(max).
    • Isi UDF skalar berisi panggilan ke Fungsi AI.
  • Saat UDF skalar digunakan dalam skenario yang tidak didukung, Anda melihat pesan kesalahan "Scalar UDF execution is currently unavailable in this context." pada waktu eksekusi kueri.

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, serta informasi inlineability. Contohnya:

     SELECT 
         SCHEMA_NAME(o.schema_id) AS SchemaName,
         o.name AS FunctionName,
         m.definition AS FunctionDefinition,
         m.is_inlineable AS Inlineable,
         m.inline_eligibility_mask AS InlineEligibilityMask
     FROM sys.objects o
     JOIN sys.sql_modules m ON o.object_id = m.object_id
     WHERE o.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 teknik inlining yang berbeda untuk mengkompilasi dan mengeksekusi kode yang ditentukan pengguna dengan cara yang terdistribusi.

Inlining UDF skalar diaktifkan secara default.

Beberapa sintaks T-SQL membuat UDF skalar tidak dapat dibariskan. Misalnya, fungsi yang berisi kombinasi WHILE perulangan dan mereferensikan tabel di dalam isi UDF tidak dapat disebariskan.

Periksa apakah UDF skalar dapat di-inlin

Tampilan sys.sql_modules katalog menyertakan kolom is_inlineable, yang menunjukkan apakah UDF sebaris. Properti berasal is_inlineable dari memeriksa sintaks di dalam definisi UDF. UDF skalar tidak sejajar sebelum waktu kompilasi.

Properti ini inline_eligibility_mask menjelaskan jenis inlining mana yang berlaku untuk UDF.

  • Nilai berarti 0 bahwa UDF tidak dapat dilinearkan.
  • Nilai menunjukkan 1 bahwa UDF memenuhi syarat untuk inlining UDF Skalar.
  • Nilai berarti 2 bahwa UDF memenuhi syarat untuk di-inline melalui blok ekspresi.
  • Nilai berarti 3 bahwa UDF memenuhi syarat untuk salah satu teknik inline.

Jika UDF skalar dapat diinline, itu tidak menjamin itu selalu sejajar saat kueri dikompilasi.

Fabric Data Warehouse memutuskan (per kueri) teknik inlining mana yang akan diterapkan.

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 dapat diinlinekan di sys.sql_modules.is_inlineable, Anda masih dapat menjalankan kueri sebagai panggilan mandiri, misalnya, untuk mengatur variabel. Tetapi fungsi skalar tidak dapat menjadi bagian dari SELECT ... FROM kueri pada tabel pengguna. Contohnya:

CREATE FUNCTION [dbo].[custom_SYSUTCDATETIME]()
  RETURNS datetime2(6)
  AS
  BEGIN
   RETURN SYSUTCDATETIME();
  END

Contoh dbo.custom_SYSUTCDATETIME fungsi skalar yang ditentukan pengguna tidak dapat diinlinekan karena penggunaan fungsi sistem nondeterminan, SYSUTCDATETIME(). Ini gagal saat digunakan dalam SELECT ... FROM kueri pada tabel pengguna, tetapi berhasil sebagai panggilan mandiri. Contohnya:

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 yang mengembalikan informasi kunci pada modul, memfilter berdasarkan objectType parameter. Ini termasuk nilai default untuk mengembalikan semua modul saat Anda memanggil fungsi 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

Panggil fungsi untuk mengembalikan semua fungsi bernilai tabel sebaris (IF):

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 Anda dapat menggabungkan hasilnya dengan tabel lain dengan menggunakan CROSS APPLY. Di sini, Anda memilih semua kolom dari keduanya sys.objects dan hasilnya ModulesByType untuk semua baris yang cocok di type kolom. Untuk informasi selengkapnya tentang menggunakan APPLY, 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';

Berlaku untuk:Azure Synapse Analytics AnalyticsPlatform 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 dalam Fabric Data Warehouse, lihat versi CREATE FUNCTION for Fabric Data Warehouse.

  • Di Analytics Platform System (PDW), nilai yang dikembalikan harus berupa nilai skalar (tunggal).

  • Di Azure Synapse Analytics, CREATE FUNCTION dapat 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 FUNCTION dapat membuat fungsi nilai tabel sebaris tetapi bukan fungsi skalar.

    Gunakan pernyataan ini untuk membuat rutinitas yang dapat digunakan kembali yang dapat Anda gunakan dengan cara berikut:

  • Dalam pernyataan Transact-SQL seperti SELECT

  • Dalam 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

Konvensi sintaks transact-SQL

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 mengikuti aturan untuk pengidentifikasi dan unik dalam database dan skemanya.

Catatan

Anda harus menyertakan tanda kurung setelah nama fungsi meskipun Anda tidak menentukan parameter.

@ parameter_name

Parameter dalam fungsi yang ditentukan pengguna. Anda dapat mendeklarasikan satu atau beberapa parameter.

Sebuah fungsi dapat memiliki hingga 2.100 parameter. Saat pengguna atau aplikasi memanggil fungsi, nilai setiap parameter yang dideklarasikan harus disediakan kecuali default untuk parameter ditentukan.

Tentukan nama parameter dengan menggunakan tanda (@) sebagai karakter pertama. Nama parameter harus mengikuti aturan untuk pengidentifikasi. Parameter bersifat lokal untuk fungsi; Anda dapat menggunakan nama parameter yang sama di fungsi lain. Parameter hanya dapat menggantikan konstanta; Mereka tidak dapat digunakan sebagai pengganti nama tabel, nama kolom, atau nama objek database lainnya.

Catatan

ANSI_WARNINGS tidak dihormati saat Anda meneruskan parameter dalam prosedur tersimpan, fungsi yang ditentukan pengguna, atau saat Anda mendeklarasikan dan mengatur variabel dalam pernyataan batch. Misalnya, jika Anda mendefinisikan variabel sebagai char(3), lalu mengaturnya ke nilai yang lebih besar dari tiga karakter, data dipotong ke ukuran yang ditentukan dan INSERT pernyataan atau UPDATE berhasil.

parameter_data_type

Jenis data parameter. Untuk fungsi Transact-SQL, semua jenis data skalar yang didukung di Azure Synapse Analytics diizinkan. Tipe data stempel waktu (rowversion) bukanlah jenis yang didukung.

[ = default ]

Nilai default untuk parameter. Jika Anda menentukan nilai default , Anda dapat menjalankan fungsi tanpa menentukan nilai untuk parameter tersebut.

Ketika parameter fungsi memiliki nilai default, Anda harus menentukan kata kunci DEFAULT saat memanggil fungsi 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. Tipe datastempel waktu/ bukanlah jenis yang didukung. Jenis nonskalar kursor dan tabel tidak diizinkan.

function_body

Serangkaian pernyataan Transact-SQL. function_body tidak dapat berisi SELECT pernyataan dan tidak dapat mereferensikan data database. function_body tidak dapat mereferensikan tabel atau tampilan. Badan 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.

TABLE

Menentukan bahwa nilai pengembalian fungsi bernilai tabel (TVF) adalah tabel. Anda hanya dapat meneruskan konstanta dan @local_variables ke TVF.

Dalam TVF sebaris (pratinjau), Anda menentukan TABLE nilai yang ditampilkan 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. Saat menentukan SCHEMABINDING, Anda tidak dapat memodifikasi objek yang mendasarinya (seperti tampilan atau tabel, misalnya) dengan cara yang memengaruhi definisi fungsi. Anda harus terlebih dahulu memodifikasi atau menghapus definisi fungsi untuk menghapus dependensi pada objek yang ingin Anda modifikasi.

Pengikatan fungsi ke objek yang dirujuknya dihapus hanya ketika salah satu tindakan berikut terjadi:

  • Anda menjatuhkan fungsinya.

  • Anda ALTER pernyataan fungsi dan hapus opsi.SCHEMABINDING

Anda hanya dapat mengikat skema fungsi jika kondisi berikut benar:

  • Setiap fungsi yang ditentukan pengguna yang direferensikan fungsi juga terikat skema.

  • Referensi fungsi menggunakan nama satu bagian atau dua bagian.

  • Di dalam isi UDF, Anda hanya dapat mereferensikan fungsi bawaan dan UDF lainnya dalam database yang sama.

  • Pengguna yang menjalankan CREATE FUNCTION pernyataan memiliki izin REFERENSI pada objek database yang direferensikan fungsi.

Untuk menghapus SCHEMABINDING, gunakan ALTER.

MENGEMBALIKAN NULL PADA INPUT NULL | DIPANGGIL PADA INPUT NULL

OnNULLCall Menentukan atribut fungsi bernilai skalar. Jika Anda tidak menentukan atribut ini, CALLED ON NULL INPUT tersirat secara default, dan isi fungsi dieksekusi meskipun NULL diteruskan sebagai argumen.

Praktik terbaik

Jika Anda tidak membuat fungsi yang ditentukan pengguna dengan klausa SCHEMABINDING, perubahan pada objek yang mendasarinya dapat memengaruhi definisi fungsi dan menyebabkan hasil yang tidak terduga saat Anda memanggilnya. Tentukan WITH SCHEMABINDING klausa saat Anda membuat fungsi. Klausa ini memastikan bahwa Anda tidak dapat memodifikasi objek yang direferensikan dalam definisi fungsi kecuali Anda juga memodifikasi fungsi.

Interoperabilitas

Pernyataan berikut valid dalam fungsi bernilai skalar:

  • Pernyataan penugasan.

  • Pernyataan Control-of-Flow, kecuali TRY... CATCH.

  • DECLARE yang menentukan variabel data lokal.

Dalam fungsi bernilai tabel sebaris (pratinjau), Anda hanya dapat menggunakan satu pernyataan pilih.

Batasan

Anda tidak dapat menggunakan fungsi yang ditentukan pengguna untuk melakukan tindakan yang memodifikasi status database.

Anda dapat menyarangkan fungsi yang ditentukan pengguna. Satu fungsi yang ditentukan pengguna dapat memanggil fungsi lain. Tingkat bersarang meningkat saat fungsi yang dipanggil memulai eksekusi, dan berkurang saat fungsi yang dipanggil selesai dieksekusi. Jika Anda melebihi tingkat maksimum bersarang, seluruh rantai fungsi pemanggilan gagal.

Anda tidak dapat membuat objek, termasuk fungsi, dalam master database kumpulan SQL nirserver 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 CREATE FUNCTION izin dalam database dan izin ALTER pada skema tempat fungsi dibuat.

Contoh

J. Menggunakan fungsi bernilai skalar yang ditentukan pengguna untuk mengubah jenis data

Fungsi sederhana ini mengambil tipe data int sebagai input, dan mengembalikan tipe 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 yang mengembalikan informasi kunci pada modul, memfilter berdasarkan objectType parameter. Ini termasuk nilai default untuk mengembalikan semua modul saat Anda memanggil fungsi 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

Anda dapat memanggil fungsi untuk mengembalikan semua objek view (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 Anda dapat menggabungkan hasilnya dengan tabel lain dengan menggunakan CROSS APPLY. Dalam contoh ini, Anda memilih semua kolom dari keduanya sys.objects dan hasilnya ModulesByType untuk semua baris yang cocok di type kolom. Untuk informasi selengkapnya tentang menggunakan APPLY, 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.

Langkah selanjutnya