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.
RETURNS TABLE
dan definisi tabel kembali akan didasarkan pada fungsi SELECT
penyataan. Tidak perlu menentukan struktur tabel kembali.RETURNS
Your 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. BEGIN
/END
sintaks.BEGIN
/END
sintaks.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.