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

Giới thiệu về các hàm có giá trị trong bảng đa câu lệnh (MSTVF) trong SQL Server

Trong SQL Server, hàm giá trị bảng nhiều câu lệnh 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 nội tuyến).

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 nhiều câu lệnh (đôi khi được gọi là MSTVF) có thể bao gồm nhiều câu lệnh, kết quả của chúng được lưu trữ trong một biến trả về. Bạn bao gồm các thông số kỹ thuật của biến trả về ở đầu hàm. Điều này chỉ định cấu trúc của bảng trả về. Nói cách khác, bạn chỉ định bao nhiêu cột, tên của chúng, kiểu dữ liệu, v.v.

Điều này trái ngược với TVF nội tuyến (còn được gọi là ITVF), không sử dụng biến trả về (bảng trả về được xác định bởi SELECT tuyên bố).

MSTVF cũ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 ITVF (ITVF không sử dụng cú pháp đó).

Ví dụ về hàm đa giá trị trong bảng sao kê

Dưới đây là một ví dụ về MSTVF cơ bản:

CREATE FUNCTION dbo.udf_PetsByName_MSTVF( @PetName varchar(70))
    RETURNS @pets TABLE (
        PetId varchar(20),
        PetName varchar(70)
    )
AS
BEGIN
    INSERT INTO @pets
    SELECT 
        CONCAT('Cat', ' ', CatId),
        CatName
    FROM dbo.Cats
    WHERE CatName = @PetName;

    INSERT INTO @pets
    SELECT 
        CONCAT('Dog', ' ', DogId),
        DogName
    FROM dbo.Dogs
    WHERE DogName = @PetName;

    IF @@ROWCOUNT = 0
    BEGIN
        INSERT INTO @pets
        VALUES (
            '',
            'There are no pets of that name.'
            )
    END

    RETURN;
END;

GO

Ở đây, tôi bắt đầu hàm bằng cách xác định biến trả về có tên là @pets . Nó thuộc loại bảng và nó sẽ trả về hai cột.

Trong trường hợp này, tôi có hai SELECT câu lệnh và một IF tuyên bố. Kết quả của mỗi kết quả được lưu trữ trong biến trả về. Điều này được thực hiện thông qua INSERT tuyên bố mỗi lần.

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).

Xem Tạo một hàm đa giá trị trong bảng để biết các ví dụ về cách thêm liên kết và mã hóa giản đồ vào ITVF.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khi hiệu suất của Distinction và Group By khác nhau?

  2. Đồng thời lạc quan:IsConcurrencyToken và RowVersion

  3. Số ký tự tối đa mà nvarchar (MAX) sẽ chứa là bao nhiêu?

  4. Tại sao bạn tạo một Dạng xem trong cơ sở dữ liệu?

  5. Thực thi một thủ tục được lưu trữ trong một thủ tục được lưu trữ khác trong máy chủ SQL