Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo một UDF liên kết lược đồ trong SQL Server

Trong SQL Server, thường là một ý tưởng hay nếu lược đồ liên kết các chức năng do người dùng xác định (UDF).

Lược đồ ràng buộc UDF của bạn sẽ đảm bảo rằng các bảng bên dưới không thể thay đổi theo cách có thể ảnh hưởng đến chức năng của bạn. Nếu không có liên kết lược đồ, các bảng bên dưới hoặc các đối tượng khác có thể bị sửa đổi hoặc thậm chí bị xóa. Làm điều này có thể phá vỡ chức năng.

Để tạo một UDF liên kết giản đồ, hãy sử dụng WITH SCHEMABINDING trong mã T-SQL của bạn để tạo hàm. Điều này áp dụng cho dù hàm là một hàm vô hướng hay một hàm giá trị bảng (TVF).

Trong mọi trường hợp, tôi đã bao gồm các ví dụ về TVF nội tuyến, TVF đa câu lệnh và hàm vô hướng.

Ví dụ 1 - Hàm Inline Table-Valued

Dưới đây là một ví dụ về cách tạo TVF nội tuyến với liên kết giản đồ:

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

Lưu ý rằng tôi đã sử dụng tên hai phần khi tham chiếu bảng trong truy vấn của mình (tôi đã sử dụng dbo.Cats khi tham chiếu bảng, thay vì chỉ Cats ). Thực hiện điều này là một yêu cầu đối với lược đồ ràng buộc một đối tượng. Nếu bạn cố gắng liên kết lược đồ một đối tượng mà không sử dụng tên gồm hai phần, bạn sẽ gặp lỗi.

Bây giờ, lược đồ tôi đã ràng buộc hàm của mình, nếu tôi cố gắng bỏ bảng được tham chiếu trong định nghĩa của nó, tôi sẽ gặp lỗi:

DROP TABLE Cats;

Kết quả:

Msg 3729, Level 16, State 1, Line 1
Cannot DROP TABLE 'cats' because it is being referenced by object 'udf_CatsByName_ITVF'.

Đây là những gì sẽ xảy ra nếu tôi cố gắng tạo hàm mà không sử dụng cách đặt tên gồm hai phần:

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

Kết quả:

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.

Ví dụ 2 - Chức năng có giá trị trong bảng đa câu lệnh

Với TVF nhiều câu lệnh, bạn đặt WITH SCHEMABINDING sau đặc tả biến trả về.

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

Ví dụ 3 - Hàm vô hướng

Đây là một ví dụ về hàm vô hướng:

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

Ví dụ 4 - Thêm nhiều đối số

Bạn có thể chỉ định nhiều đối số dưới dạng danh sách được phân tách bằng dấu phẩy. Ví dụ:nếu bạn muốn chỉ định liên kết giản đồ mã hóa, sau đó bạn sẽ cần thêm những thứ này dưới dạng danh sách được phân tách bằng dấu phẩy.

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. Cách tách một chuỗi trong SQL Server

  2. Giới thiệu về các hàm có giá trị bảng nội tuyến (ITVF) trong SQL Server

  3. Có thể truy cập cơ sở dữ liệu .mdf mà không có SQL Server không?

  4. Truy vấn SQL cho trung bình cuộn trong 7 ngày trong SQL Server

  5. SQL giữa không bao gồm