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.