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 đồ.