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

Tạo một hàm có giá trị bảng nội tuyến (ITVF) trong SQL Server

Bạn có thể tạo một hàm có giá trị bảng nội tuyến (ITVF) trong SQL Server bằng cách sử dụng T-SQL CREATE FUNCTION cú pháp.

Cú pháp

Đây là cú pháp chính thức cho TVF nội tuyến.

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 [ ) ]  
[ ; ]  

Ví dụ 1 - ITVF cơ bản

Dưới đây là một ví dụ về một hàm giá trị trong bảng nội tuyến cơ bản.

CREATE FUNCTION dbo.udf_CatsByName_ITVF( @CatName varchar(70) )
    RETURNS TABLE
AS
RETURN (
    SELECT 
        CatId,
        CatName,
        Phone
    FROM dbo.Cats
    WHERE CatName = @CatName
    );

GO

Trong trường hợp này, hàm yêu cầu một tên mèo được chuyển vào làm đối số. Sau đó, nó sử dụng đối số này trong truy vấn để trả về dữ liệu có liên quan.

Ví dụ 2 - Thêm liên kết giản đồ

Thông thường, một ý tưởng hay là lược đồ liên kết các chức năng của bạn bằng cách sử dụng SCHEMABINDING lý lẽ.

Làm điều này sẽ đảm bảo rằng các bảng bên dưới không thể bị 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 có thể được 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.

Đây là chức năng tương tự, nhưng lần này có 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'.

Nhân tiện, đây là điều sẽ xảy ra nếu tôi cố gắng tạo hàm mà không sử dụng đặt tên 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ụ 3 - Thêm mã hóa

Bạn cũng có thể mã hóa các chức năng của mình bằng cách sử dụng ENCRYPTION lý lẽ.

Dưới đây là một ví dụ về mã hóa hàm:

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

Bây giờ tôi không thể xem định nghĩa của hàm.

SELECT definition 
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('udf_CatsByName_ITVF');

Kết quả:

+--------------+
| definition   |
|--------------|
| NULL         |
+--------------+

Tôi cũng nhận được thông báo lỗi khi cố gắng tập lệnh cho định nghĩa của hàm qua Azure Data Studio:

No script was returned when scripting as Create on object UserDefinedFunction

Lưu ý rằng văn bản của hàm được mã hóa vẫn có sẵn cho người dùng có đặc quyền có thể truy cập các bảng hệ thống qua cổng DAC hoặc truy cập trực tiếp vào các tệp cơ sở dữ liệu. Ngoài ra, người dùng có thể đính kèm trình gỡ lỗi vào quy trình máy chủ có thể truy xuất quy trình ban đầu từ bộ nhớ trong thời gian chạy.


  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 ghi lại cơ sở dữ liệu SQL Server của bạn

  2. Trích xuất số tuần từ một ngày trong SQL Server (T-SQL)

  3. Truy vấn SQL chậm trong ứng dụng .NET nhưng ngay lập tức trong SQL Server Management Studio

  4. UPSERT nguyên tử trong SQL Server 2005

  5. Ví dụ về SQRT () trong SQL Server