Tái Sử Dụng Code & Tự Động Hóa Công Thức Với User-Defined Functions (UDF)

3b0f2aa8-7667-4fb0-98cd-8741df02d40f

Chào mừng bạn quay trở lại với trong chuỗi series SQL Nâng Cao cùng MCNA Technology School!

Trong quá trình làm việc với cơ sở dữ liệu, chắc hẳn bạn đã từng phải lặp đi lặp lại một công thức tính toán phức tạp (như tính thuế, tính điểm trung bình có trọng số, hoặc quy đổi tỷ giá) ở nhiều câu truy vấn khác nhau. Làm thế nào để “đóng gói” công thức đó thành một hàm riêng biệt và gọi ra dùng bất cứ lúc nào? User-Defined Functions (UDF) trong SQL chính là công cụ giúp bạn thực hiện điều này.

1. User-Defined Functions (UDF) Trong SQL Là Gì?

User-Defined Functions (UDF) là các hàm do người dùng tự định nghĩa để mở rộng khả năng tính toán của SQL Server bên cạnh các hàm có sẵn như SUM(), COUNT(), AVG().

Ưu điểm của UDF:

  • Modular Code (Mô-đun hóa): Viết logic tính toán một lần, sử dụng ở bất kỳ đâu trong các câu lệnh SELECT, WHERE, HAVING.

  • Dễ bảo trì: Khi công thức tính toán thay đổi, bạn chỉ cần sửa logic bên trong hàm UDF mà không cần sửa lại hàng trăm câu truy vấn gốc.

  • Thực thi linh hoạt: Khác với Stored Procedure, hàm UDF có thể nhúng trực tiếp vào trong mệnh đề SELECT để tính toán trên từng dòng dữ liệu.

2. Phân Biệt 2 Loại Hàm UDF Phổ Biến

2.1. Scalar Functions (Hàm trả về giá trị đơn)

Trả về đúng 01 giá trị duy nhất (kiểu số, chuỗi, ngày tháng…).

SQL

-- Tạo hàm tính giá trị sau thuế VAT (10%)
CREATE FUNCTION fn_TinhThueVAT (@GiaGoc DECIMAL(18,2))
RETURNS DECIMAL(18,2)
AS
BEGIN
    RETURN @GiaGoc * 1.10;
END;

-- Cách gọi hàm trong câu truy vấn
SELECT TenKhoaHoc, HocPhi, dbo.fn_TinhThueVAT(HocPhi) AS HocPhiCoVAT
FROM KhoaHoc;

2.2. Table-Valued Functions (Hàm trả về một bảng dữ liệu)

Trả về kết quả là một bảng dữ liệu (Table). Loại hàm này đóng vai trò tương tự một VIEW có nhận tham số đầu vào.

SQL

-- Tạo hàm lấy danh sách học viên theo từng lớp
CREATE FUNCTION fn_GetHocVienTheoLop (@MaLop VARCHAR(10))
RETURNS TABLE
AS
RETURN (
    SELECT MaHV, HoTen, Email
    FROM HocVien
    WHERE MaLop = @MaLop
);

-- Cách gọi hàm (dùng như một bảng bình thường)
SELECT * FROM dbo.fn_GetHocVienTheoLop('SQL-ADV');

⚡ CẨN TRỌNG VỚI HẠN CHẾ HIỆU NĂNG CỦA SCALAR FUNCTION!

Lạm dụng Scalar Function trong mệnh đề SELECT trên các bảng dữ liệu hàng triệu dòng có thể gây ra hiện tượng RBAR (Row-By-Agonizing-Row) – hàm phải chạy đi chạy lại từng dòng một làm suy giảm hiệu năng nghiêm trọng.

🚀 Đồng hành cùng Khóa học SQL Nâng Cao & Tối Ưu Hệ Thống tại MCNA Technology School:

  • Master kỹ thuật: Chuyển đổi Scalar Function sang Inline Table-Valued Function để tối ưu tốc độ gấp 10 lần.

  • Xử lý bài toán lớn: Xây dựng hệ thống thư viện hàm chuẩn hóa cho toàn bộ doanh nghiệp.

  • Mentor 1:1: Được các Chuyên gia Dữ liệu trực tiếp đánh giá và tối ưu Code.

👉 [ĐĂNG KÝ NHẬN TƯ VẤN ] (link đăng ký)

3. So Sánh Nhanh UDF Và Stored Procedure

Tiêu chí User-Defined Function (UDF) Stored Procedure
Mục đích chính Tính toán và trả về giá trị / bảng dữ liệu Thực hiện các tác vụ logic phức tạp / thay đổi dữ liệu
Giá trị trả về Bắt buộc phải có RETURN Có thể trả về hoặc không
Sử dụng trong SELECT Có thể nhúng trực tiếp vào câu lệnh SELECT Không thể nhúng, phải gọi bằng EXEC
Thay đổi dữ liệu Không được phép dùng INSERT, UPDATE, DELETE làm thay đổi bảng gốc Cho phép thao tác chỉnh sửa dữ liệu thoải mái

4. Bài Tập Thực Hành SQL Nâng Cao (Bài 6)

Hãy áp dụng kiến thức về User-Defined Functions (UDF) để giải bài tập xếp loại học viên dưới đây:

Đề bài: Cho bảng HocVien (MaHV, HoTen, DiemThi).

  1. Viết một Scalar Function tên là fn_XepLoai nhận vào tham số @DiemThi FLOAT và trả về chuỗi NVARCHAR(20) xếp loại:

    • Nếu @DiemThi >= 8.0 ➔ Trả về 'Giỏi'

    • Nếu @DiemThi >= 6.5 ➔ Trả về 'Khá'

    • Ngược lại ➔ Trả về 'Trung bình'

  2. Viết câu lệnh SELECT hiển thị HoTen, DiemThi và cột XepLoai bằng cách gọi hàm fn_XepLoai vừa tạo.

SQL

-- 1. Tạo Scalar Function xếp loại học viên
CREATE FUNCTION fn_XepLoai (@DiemThi FLOAT)
RETURNS NVARCHAR(20)
AS
BEGIN
    DECLARE @KetQua NVARCHAR(20);
    
    IF @DiemThi >= 8.0
        SET @KetQua = N'Giỏi';
    ELSE IF @DiemThi >= 6.5
        SET @KetQua = N'Khá';
    ELSE
        SET @KetQua = N'Trung bình';
        
    RETURN @KetQua;
END;

-- 2. Thực thi gọi hàm trong câu truy vấn
SELECT 
    HoTen, 
    DiemThi, 
    dbo.fn_XepLoai(DiemThi) AS XepLoai
FROM HocVien;

Tác giả: Huỳnh Trung Hậu

📞 Hotline: 0939.866.825 (Mr. Minh Khang)
🌐 Website: MCNA Technology School
📍 Hà Nội: 30 Trung Liệt, Đống Đa | Liền kề 44B TT2 Văn Quán, Hà Đông
📍 TP.HCM: 50B Phan Tây Hồ, Cầu Kiệu

Chỉ mục