Trong SQL Server, hàm có giá trị bảng (TVF) là một hàm do người dùng định nghĩa trả về một bảng. Điều này trái ngược với một hàm vô hướng, trả về một giá trị duy nhất.
Bạn có thể gọi một hàm có giá trị bảng giống như cách bạn có thể truy vấn một bảng. Ví dụ:bạn có thể sử dụng nó trong SELECT
tuyên bố. Trong một số trường hợp, các hàm có giá trị bảng cũng có thể được sử dụng để cập nhật, xóa và chèn dữ liệu.
Các loại hàm được định giá trong bảng
Khi bạn tạo một hàm giá trị bảng, bạn có quyền lựa chọn tạo một hàm định giá bảng Transact-SQL hoặc một hàm định giá bảng Ngôn ngữ chung (CLR).
Các hàm có giá trị trong bảng Transact-SQL
Transact-SQL TVFs có thể là một trong những dạng sau:
- Hàm Nội tuyến Giá trị Bảng (ITVF)
- Khi bạn tạo ITVF, bạn bắt đầu định nghĩa hàm với
RETURNS TABLE
vàSELECT
tiếp theo câu lệnh xác định cấu trúc của bảng trả về. - Hàm đa giá trị trong bảng sao kê (MSTVF)
- Một hàm giá trị bảng nhiều câu lệnh có thể chứa nhiều câu lệnh, kết quả của các câu lệnh này được lưu vào một biến mà bạn khai báo ở đầu hàm. Khi bạn làm điều này, bạn chỉ định rõ ràng cấu trúc của bảng trả về.
Các hàm được định giá trong bảng CLR
Từ góc độ CLR, cú pháp tương tự như T-SQL ITVF, nhưng hơi khác một chút. Bạn chỉ định rõ ràng cấu trúc của bảng trả về, nhưng bạn không khai báo một biến trả về.
Các hàm có giá trị bảng CLR được triển khai dưới dạng các phương thức trên một lớp trong hợp ngữ Microsoft .NET Framework.
Để có cái nhìn tổng quan chi tiết hơn về CLR TVF, hãy xem tài liệu của Microsoft về Các chức năng được định giá bằng bảng CLR.
Ví dụ 1 - Hàm Inline Table-Valued
Dưới đây là một ví dụ về mã T-SQL được sử dụng để tạo một hàm có giá trị bảng nội tuyế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
Chúng ta có thể nói rằng đây là một hàm có giá trị bảng nội tuyến, bởi vì nó không chỉ định cấu trúc của bảng trả về. Nó đơn giản chỉ ra RETURNS TABLE
, sau đó dựa vào SELECT
để xác định cấu trúc của bảng trả về.
Trong trường hợp này, hàm yêu cầu nhập tên mèo làm đối số.
Hãy xem Tạo một chức năng có giá trị bảng nội tuyến để biết các ví dụ về việc thêm các tùy chọn như liên kết và mã hóa lược đồ.
Liên kết lược đồ thường là một ý tưởng hay, vì nó sẽ ngăn chặn bất kỳ thay đổi bất lợi nào được thực hiện đối với các đối tượng cơ bản mà hàm tham chiếu.
Ví dụ 2 - Chức năng có giá trị trong bảng đa câu lệnh
Đây là cách chúng tôi viết hàm nếu chúng tôi muốn nó trở thành một hàm có giá trị trong bảng nhiều câu lệnh.
CREATE FUNCTION udf_CatsByName_MSTVF( @CatName varchar(70) ) RETURNS @cats TABLE ( CatId int, CatName varchar(70), Phone varchar(10) ) AS BEGIN INSERT INTO @cats SELECT CatId, CatName, Phone FROM dbo.Cats WHERE CatName = @CatName; RETURN; END; GO
Trong trường hợp này, chúng tôi sử dụng một biến loại bảng được gọi là @cats
và chúng tôi chỉ định rõ ràng cấu trúc của bảng trả về. Kết quả truy vấn được lưu trữ trong biến đó, sau đó sẽ được trả về khi hàm được gọi.
Ví dụ này không thực sự công bằng cho MSTVF, bởi vì tôi chỉ đưa vào một tuyên bố duy nhất. Điểm chính của MSTVF là bạn có thể bao gồm nhiều câu lệnh và bạn có thể thêm đầu ra của những câu lệnh đó vào biến trả về.
Hãy xem Tạo một hàm đa giá trị trong bảng sao kê để biết ví dụ về việc sử dụng nhiều câu lệnh, cũng như các ví dụ về việc thêm các tùy chọn như liên kết lược đồ và mã hóa.
Ví dụ 3 - Chọn Dữ liệu từ các Hàm được Định giá trong Bảng của chúng tôi
Vì vậy, bây giờ chúng tôi đã tạo các hàm của mình, chúng tôi có thể gọi cả hai hàm bằng cách sử dụng SELECT
tuyên bố.
SELECT * FROM udf_CatsByName_ITVF('Tom'); SELECT * FROM udf_CatsByName_MSTVF('Tom');
Kết quả:
+---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected) +---------+-----------+------------+ | CatId | CatName | Phone | |---------+-----------+------------| | 3 | Tom | 7871237652 | +---------+-----------+------------+ (1 row affected)
Cả ITVF và MSTVF đều được gọi bằng cùng một cú pháp và cả hai đều trả về cùng một kết quả.
Gọi các hàm có giá trị trong bảng
Các hàm có giá trị bảng có thể được gọi trong đó các biểu thức bảng được phép trong FROM
mệnh đề của SELECT
, INSERT
, UPDATE
hoặc DELETE
tuyên bố.
Điều này có nghĩa là bạn có thể chọn dữ liệu, chèn dữ liệu, cập nhật dữ liệu và thậm chí xóa dữ liệu thông qua một chức năng có giá trị bảng.
Dưới đây là các bài báo chứng minh từng điều:
- Chọn Dữ liệu qua Chức năng Định giá trên Bảng
- Cập nhật dữ liệu thông qua một chức năng được định giá bằng bảng
- Chèn dữ liệu thông qua một chức năng được định giá bằng bảng
- Xóa dữ liệu thông qua một chức năng được định giá bằng bảng