Trong SQL Server, hàm giá trị bảng nội tuyến là một trong hai loại hàm giá trị bảng Transact-SQL (loại còn lại là hàm giá trị bảng đa câu lệnh).
Các hàm có giá trị bảng (TVF) là một loại hàm do người dùng định nghĩa trả về kết quả của chúng dưới dạng bảng. Do đó, chúng có thể được truy vấn giống như một bảng bình thường.
Các TVF nội tuyến (đôi khi được gọi là ITVF) không có các biến trả về liên quan. Giá trị trả về được xác định thông qua một SELECT
duy nhất tuyên bố. Câu lệnh này xác định cấu trúc của bảng trả về. Điều này trái ngược với TVF nhiều câu lệnh (còn được gọi là MSTVF), yêu cầu một biến trả về.
ITVF cũng không sử dụng BEGIN
/ END
cú pháp, là một thứ khác giúp phân biệt chúng với MSTVF.
TVF nội tuyến thường được coi là có hiệu suất tốt hơn TVF đa câu lệnh, mặc dù điều này cũng sẽ phụ thuộc vào những gì bạn đang cố gắng thực hiện trong chức năng.
Ví dụ về Hàm Giá trị Bảng Nội tuyến
Dưới đây là ví dụ về ITVF cơ bản:
CREATE FUNCTION dbo.ufn_AlbumsByArtist(@ArtistId int) RETURNS TABLE AS RETURN ( SELECT al.ArtistId, al.AlbumName, g.Genre FROM dbo.Albums al INNER JOIN dbo.Artists ar ON al.ArtistId = ar.ArtistId INNER JOIN Genres g ON al.GenreId = g.GenreId WHERE al.ArtistId = @ArtistId ); GO
Về cơ bản, nó bao gồm một SELECT
câu lệnh được bao bọc bên trong một số mã khác. Để đặc biệt biến nó thành một nội tuyến TVF, tôi đã bắt đầu chức năng này với RETURNS TABLE
, theo sau là RETURN
và kết thúc bằng SELECT
câu lệnh bên trong dấu ngoặc đơn.
Nhiều câu lệnh
Mặc dù các hàm có giá trị bảng nội tuyến không được thiết kế cho nhiều SELECT
câu lệnh (đó là những gì MSTVF dành cho), có thể sử dụng UNION
toán tử để kết hợp tập hợp kết quả của nhiều câu lệnh.
Ví dụ:
CREATE FUNCTION [dbo].[udf_PetsByName_ITVF]( @PetName varchar(70)) RETURNS TABLE AS RETURN ( SELECT CONCAT('Cat', ' ', CatId) AS PetId, CatName FROM dbo.Cats WHERE CatName = @PetName UNION ALL SELECT CONCAT('Dog', ' ', DogId) AS PetId, DogName FROM dbo.Dogs WHERE DogName = @PetName ); GO
Tùy chọn chức năng
Bạn cũng có thể chỉ định những thứ như, có hay không sử dụng liên kết lược đồ (bạn có thể nên) và có mã hóa hàm hay không.
Liên kết lược đồ 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 phụ thuộc vào (chẳng hạn như giảm bảng, thay đổi cột, v.v.).
Mã hóa sẽ chuyển đổi định nghĩa của hàm sang định dạng khó hiểu (để ngăn người khác đọc được).
Hãy xem Tạo một hàm có giá trị bảng nội tuyến để biết các ví dụ về cách thêm liên kết và mã hóa lược đồ vào ITVF.