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

Buat Fungsi Bernilai Tabel Sebaris (ITVF) di SQL Server

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.


  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 cara menangani nama kolom SQL yang terlihat seperti kata kunci SQL?

  2. Apakah ada perbedaan antara DateTime di c # dan DateTime di SQL server?

  3. Cara Mengirim Hasil Kueri Email sebagai Lampiran di SQL Server (T-SQL)

  4. Fungsi untuk Menghitung Median di SQL Server

  5. Berapa ukuran batch yang direkomendasikan untuk SqlBulkCopy?