Bạn có thể tạo một hàm có giá trị bảng (TVF) trong SQL Server bằng cách sử dụng CREATE FUNCTION Cú pháp T-SQL.
Cú pháp hơi khác một chút tùy thuộc vào việc bạn đang tạo một hàm giá trị bảng nội dòng (ITVF) hay một hàm giá trị bảng nhiều câu lệnh (MSTVF).
Ví dụ 1 - Hàm Inline Table-Valued
Đây là một ví dụ về một hàm có giá trị bảng nội dòng.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int)
RETURNS TABLE
AS
RETURN(
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM Genres g
INNER JOIN Albums al
ON g.GenreId = al.GenreId
INNER JOIN Artists ar
ON al.ArtistId = ar.ArtistId
WHERE g.GenreId = @GenreId
);
GO
Chúng ta có thể nói rằng đây là một hàm có giá trị bảng nội dòng, 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 ID thể loại được chuyển vào dưới dạng đối số.
Hãy xem Tạo một chức năng được định giá bằng bảng nội tuyến để biết các ví dụ về cách 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 dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int)
RETURNS @Albums TABLE (
ArtistName nvarchar(255),
AlbumName nvarchar(255),
Genre nvarchar(50)
)
AS
BEGIN
INSERT INTO @Albums
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM Genres g
INNER JOIN Albums al
ON g.GenreId = al.GenreId
INNER JOIN Artists ar
ON al.ArtistId = ar.ArtistId
WHERE g.GenreId = @GenreId
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à @Albums 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 đó được trả về khi hàm được gọi.
Một trong những lợi ích của MSTVF là chúng có thể chứa nhiều câu lệnh. Đây là một lần nữa với một phần bổ sung được thêm vào cuối.
CREATE FUNCTION dbo.ufn_AlbumsByGenre_MSTVF(@GenreId int)
RETURNS @Albums TABLE (
ArtistName nvarchar(255),
AlbumName nvarchar(255),
Genre nvarchar(50)
)
AS
BEGIN
INSERT INTO @Albums
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM Genres g
INNER JOIN Albums al
ON g.GenreId = al.GenreId
INNER JOIN Artists ar
ON al.ArtistId = ar.ArtistId
WHERE g.GenreId = @GenreId
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO @Albums
VALUES (
'None',
'None',
'None'
)
END
RETURN
END
GO
Xem Tạo một chức năng có giá trị trong bảng sao kê để 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 đồ.