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.
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 |
Đị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);
Đị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);
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
❌ 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...
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ó |
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:
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.