Anda dapat membuat fungsi bernilai tabel sebaris (ITVF) di SQL Server menggunakan CREATE FUNCTION
T-SQL sintaks.
Sintaks
Inilah sintaks resmi untuk TVF 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 [ ) ] [ ; ]
Contoh 1 – ITVF Dasar
Berikut adalah contoh fungsi nilai tabel sebaris dasar.
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Dalam hal ini, fungsi memerlukan nama cat yang diteruskan sebagai argumen. Kemudian menggunakan argumen ini dalam kueri untuk mengembalikan data yang relevan.
Contoh 2 – Tambahkan Pengikatan Skema
Biasanya merupakan ide yang baik untuk mengikat skema fungsi Anda dengan menggunakan SCHEMABINDING
argumen.
Melakukan ini akan memastikan bahwa tabel yang mendasarinya tidak dapat diubah dengan cara yang akan memengaruhi fungsi Anda.
Tanpa pengikatan skema, tabel yang mendasarinya dapat dimodifikasi atau bahkan dihapus. Melakukan hal ini dapat merusak fungsi.
Ini fungsinya sama, tapi kali ini dengan skema binding:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Perhatikan saya menggunakan nama dua bagian saat mereferensikan tabel dalam kueri saya (saya menggunakan dbo.Cats
saat mereferensikan tabel, alih-alih hanya Cats
). Melakukan ini adalah persyaratan untuk skema yang mengikat objek. Jika Anda mencoba untuk mengikat skema objek tanpa menggunakan nama dua bagian, Anda akan mendapatkan kesalahan.
Sekarang saya telah mengikat skema fungsi saya, jika saya mencoba untuk menjatuhkan tabel yang direferensikan dalam definisinya, saya mendapatkan kesalahan:
DROP TABLE Cats;
Hasil:
Msg 3729, Level 16, State 1, Line 1 Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.
Omong-omong, inilah yang terjadi jika saya mencoba membuat fungsi tanpa menggunakan penamaan dua bagian:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING AS RETURN ( SELECT CatId, CatName, Phone FROM Cats WHERE CatName = @CatName ); GO
Hasil:
Msg 4512, Level 16, State 3, Procedure udf_CatsByName_ITVF, Line 7 Cannot schema bind table valued function 'dbo.udf_CatsByName_ITVF' because name 'Cats' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.
Contoh 3 – Tambahkan Enkripsi
Anda juga dapat mengenkripsi fungsi Anda menggunakan ENCRYPTION
argumen.
Berikut ini contoh mengenkripsi fungsi:
CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) ) RETURNS TABLE WITH SCHEMABINDING, ENCRYPTION AS RETURN ( SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName ); GO
Sekarang saya tidak dapat melihat definisi fungsi.
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');
Hasil:
+--------------+ | definition | |--------------| | NULL | +--------------+
Saya juga mendapatkan pesan kesalahan saat mencoba membuat skrip definisi fungsi melalui Azure Data Studio:
No script was returned when scripting as Create on object UserDefinedFunction
Perhatikan bahwa teks fungsi terenkripsi masih tersedia untuk pengguna istimewa yang dapat mengakses tabel sistem melalui port DAC atau mengakses file database secara langsung. Selain itu, pengguna yang dapat melampirkan debugger ke proses server dapat mengambil prosedur asli dari memori saat runtime.