Các câu trả lời khác đã chỉ ra rằng CASE là một biểu thức , không phải là một câu lệnh và do đó, bản thân nó không thể bao gồm các câu lệnh (như RAISEERROR
hoặc bất kỳ câu nào khác). Nếu các điều kiện không nhiều - đặc biệt khi đó chỉ là một điều kiện, - câu lệnh IF là lựa chọn hoàn hảo cho những gì bạn đang cố gắng thực hiện, như đã được đề cập.
Tuy nhiên, tùy thuộc vào kịch bản của bạn, một biểu thức CASE vẫn có thể được sử dụng, chỉ không chính xác như cách bạn đã thể hiện. Cụ thể, nếu có nhiều điều kiện cần kiểm tra trong đó một trận đấu sẽ dẫn đến cùng một tập hợp hành động (ví dụ: đưa ra một ngoại lệ và chấm dứt tập lệnh), bạn có thể sử dụng biểu thức CASE trong câu lệnh gán lưu trữ kết quả của CASE, sau đó làm theo nó với IF kiểm tra kết quả được lưu trữ và thực hiện (các) hành động cần thiết nếu thích hợp, như thế này:
DECLARE @ErrorMessage varchar(1000);
SET @ErrorMessage =
CASE WHEN @dateA = @dateB THEN
'Dates equal'
CASE WHEN ... /* some other condition */ THEN
'Some other message'
.
.
.
ELSE
'' -- no message if nothing is wrong;
-- you can also omit the ELSE branch entirely,
-- which means the same as ELSE NULL
END
;
IF @ErrorMessage <> ''
BEGIN
RAISERROR (@ErrorMessage, 20, -1) WITH LOG;
END;
... /* continue the script */
Trong trường hợp này, hành động cần thiết là đưa ra một ngoại lệ, nhưng thông báo được trả lại với ngoại lệ cần phụ thuộc vào điều kiện nào được kiểm tra trước. Câu lệnh gán sử dụng biểu thức CASE để chọn thông báo nào sẽ lưu trong @ErrorMessage
biến.
Bạn cũng có thể thấy rằng lỗi chỉ được nêu lên một cách có điều kiện - chỉ khi biến thực sự chứa thông báo hiển thị. Nếu giá trị là một chuỗi rỗng hoặc null, tập lệnh sẽ tiếp tục mà không bị gián đoạn.
CASE
- SQL Server chỉ cóCASE
biểu thức.