Hàm Table-Valued Function trong SQL Server

Giải thích chi tiết hơn về hàm trả về bảng trong SQL Server (Table-Valued Function – TVF), kèm theo ví dụ thực tế, ưu nhược điểm, và so sánh với stored procedure để bạn hiểu rõ hơn.

  1. Khái niệm Table-Valued Function trong SQL Server
  2. Phân loại hàm Table-Valued Function
  3. Cách code và chi tiết về Table-Valued Function
  4. Lưu ý khi dùng Table-Valued Function
  5. So sánh với Stored Procedure
  6. Khi nào dùng Table-Valued Function trong SQL Server

1. Khái niệm Table-Valued Function trong SQL Server

Table-Valued Function (TVF) là một hàm người dùng định nghĩa (User-Defined Function – UDF) trong SQL Server, có khả năng trả về dữ liệu dạng bảng.

2. Phân loại hàm Table-Valued Function

Loại Đặc điểm chính Khi nào dùng
Inline TVF Chỉ có 1 lệnh SELECT, trả trực tiếp Nhanh, đơn giản
Multi-statement TVF Có thể có nhiều lệnh T-SQL, lưu vào biến bảng rồi trả ra Cần xử lý logic phức tạp

3. Cách code và chi tiết về Table-Valued Function

Inline Table-Valued Function

Định nghĩa: là hàm trả về 1 table duy nhất dựa vào cấu trúc câu select ta sử dụng

CREATE FUNCTION fn_HocSinhTheoLop (@MaLop INT)
RETURNS TABLE
AS
RETURN (
    SELECT MaHS, HoTen, DiemTB
    FROM HocSinh
    WHERE MaLop = @MaLop
);

Cách họi hàm

SELECT * FROM fn_HocSinhTheoLop(10);

Multi-statement Table-Valued Function

Định nghĩa: là hàm trả về nhiều table dựa vào biến tạm được tạo ra trong hàm.

CREATE FUNCTION fn_HocSinhGioi (@DiemMin FLOAT)
RETURNS @DanhSach TABLE (
    MaHS INT,
    HoTen NVARCHAR(100),
    DiemTB FLOAT
)
AS
BEGIN
    -- Bước xử lý: lọc học sinh giỏi
    INSERT INTO @DanhSach
    SELECT MaHS, HoTen, DiemTB
    FROM HocSinh
    WHERE DiemTB >= @DiemMin;

    -- Có thể xử lý thêm ở đây nếu cần...

    RETURN;
END

Cách gọi hàm:

SELECT * FROM fn_HocSinhGioi(8.0);

Hàm trả về table không câu Select

Mục đích: tạo ra dữ liệu tự tạo

CREATE FUNCTION fn_TaoBangTuyY()
RETURNS @KetQua TABLE (
    STT INT,
    NoiDung NVARCHAR(100)
)
AS
BEGIN
    -- Tự tạo dữ liệu thủ công
    INSERT INTO @KetQua VALUES (1, N'Xin chào');
    INSERT INTO @KetQua VALUES (2, N'Đây là hàm tự tạo bảng');
    INSERT INTO @KetQua VALUES (3, N'Không lấy từ bảng dữ liệu');
    
    RETURN;
END

4. Lưu ý khi dùng Table-Valued Function

❌ Không được INSERT, UPDATE, DELETE trong bảng trả về trực tiếp (chỉ làm trên biến bảng nội bộ @TenBang)   

✅ Có thể JOIN, WHERE, GROUP BY trên kết quả của hàm   

❌ Không được gọi các PROCEDURE trong hàm   

⚠️ Hàm chạy trong ngữ cảnh "thuần SQL", nên không hỗ trợ thao tác cấp hệ thống như backup, email...   

5. So sánh với Stored Procedure

Tiêu chí TVF (Function) Stored Procedure
Trả về bảng ✅ Có ❌ Không trực tiếp (phải dùng SELECT)
Gọi trong câu lệnh SELECT ✅ Có thể ❌ Không thể
Có thể dùng trong JOIN ✅ Có ❌ Không
Gọi thủ tục con ❌ Không ✅ Có
Có thể thay đổi dữ liệu (INSERT/UPDATE/DELETE) ❌ Không (trực tiếp) ✅ Có

 

6. Khi nào dùng Table-Valued Function trong SQL Server

    Khi bạn cần xử lý filter, nhóm, lọc, truy xuất nhiều dòng trong 1 khối lệnh SQL.
    Khi bạn cần viết hàm có thể tái sử dụng nhiều nơi trong SELECT.
    Khi muốn tách logic xử lý phức tạp thành các hàm phụ.

Tìm kiếm:

Bài viết liên quan:

Giải thích chi tiết hơn về hàm trả về bảng trong SQL Server (Table-Valued Function – TVF), kèm theo ví dụ thực tế, ưu nhược điểm, và so sánh với stored procedure để bạn hiểu rõ hơn.