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

Giới thiệu về các hàm có giá trị bảng nội tuyến (ITVF) trong SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server - Truy vấn ngắn mạch?

  2. Xác định mối quan hệ một-một trong SQL Server

  3. Mọi Bảng Người dùng có nên có Chỉ mục được phân cụm không?

  4. Làm cách nào để chuyển tên bảng vào proc được lưu trữ?

  5. Các bản sửa lỗi liên quan đến hiệu suất cho SQL Server 2012