Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tạo một hàm có giá trị bảng trong SQL Server

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 cách để kiểm tra các dòng trùng lặp trong SQL Server

  2. Giải thích tất cả toán tử SQL Server

  3. 2 cách trả về danh sách máy chủ được liên kết trong SQL Server bằng T-SQL

  4. Tại sao SQL Server sử dụng quét chỉ mục thay vì tìm kiếm chỉ mục khi mệnh đề WHERE chứa các giá trị được tham số hóa

  5. Nhận tối thiểu hai giá trị trong SQL