Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Perbedaan Antara Fungsi Bernilai Tabel Multi-Pernyataan &Fungsi Bernilai Tabel Sebaris di SQL Server

Saat Anda membuat fungsi bernilai tabel (TVF) di SQL Server, Anda dapat menjadikannya sebagai fungsi bernilai tabel sebaris (ITVF) atau fungsi bernilai tabel multi-pernyataan (MSTVF). Ada perbedaan antara tipe fungsi ini, dan mereka menggunakan sintaks yang berbeda.

Artikel ini membahas perbedaan antara MSTVF dan ITVF.

Perbedaan

Berikut adalah perbedaan utama antara MSTVF dan ITVF.

ITVF MSTVF Sintaks RETURNS Anda cukup menyebutkan RETURNS TABLE dan definisi tabel kembali akan didasarkan pada fungsi SELECT penyataan. Tidak perlu menentukan struktur tabel kembali. RETURNSYour sintaks secara eksplisit menentukan struktur tabel kembali. Ini dilakukan dengan mendeklarasikan variabel TABLE yang akan digunakan untuk menyimpan dan mengakumulasikan baris yang dikembalikan sebagai nilai fungsi. Sintaks BEGIN/END ITVF tidak menggunakan BEGIN /END sintaks. MSTVF memang menggunakan BEGIN /END sintaks. Kinerja Umumnya lebih cepat daripada MTSVF. Biasanya lebih lambat dari ITVF. Pembaruan Data Dalam beberapa kasus, mungkin untuk memperbarui data di tabel yang mendasarinya menggunakan ITFV. Anda tidak dapat memperbarui data di tabel yang mendasarinya menggunakan MSTVF.

Sintaks

Mari kita lihat perbedaan sintaks dari masing-masing tipe fungsi.

Fungsi Bernilai Tabel Sebaris

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [ READONLY ] }   
    [ ,...n ]  
  ]  
)  
RETURNS TABLE  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    RETURN [ ( ] select_stmt [ ) ]  
[ ; ]  

Fungsi Bernilai Tabel Multi-Pernyataan

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type   
    [ = default ] [READONLY] }   
    [ ,...n ]  
  ]  
)  
RETURNS @return_variable TABLE <table_type_definition>  
    [ WITH <function_option> [ ,...n ] ]  
    [ AS ]  
    BEGIN   
        function_body   
        RETURN  
    END  
[ ; ]

Perhatikan bahwa MSTVF dimulai dengan definisi tabel, tetapi ITVF tidak memiliki definisi seperti itu.

MSTVF dimulai dengan RETURNS @return_variable TABLE diikuti dengan definisi tabel. Di sini, @return_variable adalah variabel TABLE, digunakan untuk menyimpan dan mengakumulasi baris yang harus dikembalikan sebagai nilai fungsi.

Contoh 1 – Fungsi Bernilai Tabel Sebaris

Berikut adalah contoh ITVF sederhana.

CREATE FUNCTION udf_PetsByName_ITVF( @PetName varchar(70))
    RETURNS TABLE 
AS
RETURN (
    SELECT 
        CONCAT('Cat', ' ', CatId) AS PetId,
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName

    UNION ALL

    SELECT 
        CONCAT('Dog', ' ', DogId) AS PetId,
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName
    );

GO

Di sini, saya memilih dari dua tabel menggunakan UNION ALL , dan fungsinya hanya mengembalikan hasilnya.

Contoh 2 – Fungsi Bernilai Tabel Multi-Pernyataan

Berikut adalah contoh penggunaan MSTVF untuk melakukan hal yang sama, tetapi dengan cara yang berbeda.

CREATE FUNCTION udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName;

    RETURN;
END;

GO

Fungsi dimulai dengan mendeklarasikan variabel TABLE yang disebut @pets . Dalam melakukan ini, kami secara eksplisit menentukan struktur tabel kembali.

Kueri di dalam BEGIN /END blok disimpan ke variabel TABLE yang disebut @pets .

Dalam hal ini, saya memilih untuk tidak menggunakan UNION ALL . Sebagai gantinya, saya mengeksekusi pernyataan secara terpisah dan menyimpan hasilnya masing-masing ke @pets variabel.

Contoh 3 – Tambahkan Pernyataan Lain ke MSTVF

Untuk mendemonstrasikan lebih lanjut aspek "multi-pernyataan" dari MSTVF, kita dapat menambahkan lebih banyak pernyataan ke MSTVF di atas dan menyimpan hasilnya ke variabel pengembalian yang sama.

Contoh:

CREATE FUNCTION udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName;

    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @pets
        VALUES (
            '',
            'There are no pets of that name.'
            )
    END

    RETURN;
END;

GO

Dalam hal ini saya menambahkan beberapa kode untuk mengembalikan pesan khusus setiap kali kueri menghasilkan tidak ada baris yang dikembalikan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana SESSION_CONTEXT() Bekerja di SQL Server

  2. Bagaimana cara menggunakan penghapusan kaskade dengan SQL Server?

  3. Jalankan Pemicu Hanya Saat Kolom Tertentu Diperbarui (SQL Server)

  4. ISJSON() Contoh di SQL Server (T-SQL)

  5. Apakah ada kerugian untuk selalu menggunakan nvarchar(MAX)?