Kiểm Tra Bản Ghi Tồn Tại Với IF EXISTS trong MSSQL

Trong một thủ tục, bạn muốn kiểm tra xem có bản ghi nào thỏa mãn một số điều kiện nhất định trong bảng hay không, và rẽ nhánh chương trình tùy theo kết quả kiểm tra. Bạn hãy làm thế này:

IF EXISTS(SELECT 1 FROM TblName WHERE ...)
BEGIN
...
END
ELSE
BEGIN
...
END
Đây là cách làm tối ưu, vì đoạn lệnh “EXISTS(SELECT 1 FROM TblName WHERE …)” sẽ dừng lại ngay sau khi tìm được bản ghi đầu tiên; “SELECT 1″ cũng tránh cho hệ thống khỏi phải đọc dữ liệu từ bảng. Một cách khác có thể làm là:
SELECT TOP 1 1 FROM TblName WHERE...
IF @@ROWCOUNT > 0
BEGIN
...
END
ELSE
BEGIN
...
END
Tuy nhiên các cách sau đây thì tuyệt đối nên tránh:

Cách 1: KHÔNG NÊN DÙNG

IF (SELECT COUNT(*) FROM TblName WHERE...) > 0
BEGIN
...
END
ELSE
BEGIN
...
END

 Cách 2: tệ hơn nữa, KHÔNG NÊN DÙNG

SELECT * FROM TblName WHERE...
IF @@ROWCOUNT > 0
BEGIN
...
END
ELSE
BEGIN
...
END

Lý do: Cả hai cách đều thực hiện các thao tác vượt quá cần thiết, chỉ cần bản ghi đầu tiên tìm được là đủ để chương trình đi tiếp được rồi. Việc đếm số bản ghi (cách 1) hoặc trả lại tất cả các bản ghi (cách 2) làm kéo dài thời gian thực hiện đoạn lệnh. Trong nhiều trường hợp, để tìm ra bản ghi đầu tiên có thể thực hiện rất nhanh, nhưng để tìm ra toàn bộ các bản ghi lại mất một thời gian gấp nhiều lần.