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

Buat UDF Terikat Skema di SQL Server

Di SQL Server, biasanya merupakan ide bagus untuk mengikat skema fungsi yang ditentukan pengguna (UDF).

Skema yang mengikat UDF Anda akan memastikan bahwa tabel yang mendasarinya tidak dapat diubah dengan cara yang akan memengaruhi fungsi Anda. Tanpa pengikatan skema, tabel yang mendasari atau objek lain dapat dimodifikasi atau bahkan dihapus. Melakukan hal ini dapat merusak fungsi.

Untuk membuat UDF terikat skema, gunakan WITH SCHEMABINDING dalam kode T-SQL Anda untuk membuat fungsi. Ini berlaku baik fungsi tersebut merupakan fungsi skalar atau fungsi bernilai tabel (TVF).

Bagaimanapun, saya telah menyertakan contoh TVF inline, TVF multi-pernyataan, dan fungsi skalar.

Contoh 1 – Fungsi Bernilai Tabel Sebaris

Berikut ini contoh membuat TVF sebaris dengan pengikatan skema:

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'.

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 2 – Fungsi Bernilai Tabel Multi-Pernyataan

Dengan TVF multi-pernyataan, Anda menempatkan WITH SCHEMABINDING setelah spesifikasi variabel yang dikembalikan.

CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
    WITH SCHEMABINDING
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

Contoh 3 – Fungsi Skalar

Berikut ini contoh fungsi skalar:

CREATE FUNCTION dbo.ufn_CountAlbums (@ArtistId int)  
RETURNS smallint
WITH SCHEMABINDING
AS  
BEGIN
    DECLARE @AlbumCount int;
    SELECT @AlbumCount = COUNT(AlbumId)
    FROM dbo.Albums
    WHERE ArtistId = @ArtistId; 
    RETURN @AlbumCount;
END;

GO

Contoh 4 – Menambahkan Beberapa Argumen

Anda dapat menentukan beberapa argumen sebagai daftar yang dipisahkan koma. Misalnya, jika Anda ingin menentukan pengikatan skema dan enkripsi, maka Anda harus menambahkan ini sebagai daftar yang dipisahkan koma.

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menggunakan SqlTransaction di C#

  2. Bagaimana SESSION_CONTEXT() Bekerja di SQL Server

  3. DI MANA DI (array ID)

  4. Konversi 'datetime' menjadi 'datetime2' di SQL Server (Contoh T-SQL)

  5. Memahami Alias ​​Kolom di Select Query di SQL Server - Tutorial SQL Server / TSQL Bagian 115