Làm thế nào về điều này - như được báo cáo với tôi bởi Itzik Ben-Gan, người đã được Jaime Lafargue nói về nó ?
DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;
Kết quả:
Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
Tất nhiên có những cách giải quyết tầm thường, nhưng vấn đề vẫn là CASE
không phải lúc nào cũng đảm bảo đánh giá từ trái sang phải / ngắn mạch. Tôi đã báo cáo lỗi ở đây và nó đã bị đóng là "theo thiết kế." Paul White sau đó đã nộp mục Kết nối này và nó đã bị đóng là Đã sửa. Không phải vì nó đã được sửa mỗi lần, mà bởi vì họ đã cập nhật Sách trực tuyến với một mô tả chính xác hơn về kịch bản mà các tổng hợp có thể thay đổi thứ tự đánh giá của một CASE
biểu thức. Gần đây tôi đã viết blog nhiều hơn về điều này ở đây .
EDIT chỉ là một phụ lục, trong khi tôi đồng ý rằng đây là những trường hợp cạnh, hầu hết thời gian bạn có thể dựa vào đánh giá từ trái sang phải và ngắn mạch, và đây là những lỗi mâu thuẫn với tài liệu và cuối cùng có thể sẽ được sửa chữa ( điều này không chắc chắn - hãy xem cuộc trò chuyện tiếp theo trên bài đăng trên blog của Bart Duncan để biết lý do tại sao), tôi phải không đồng ý khi mọi người nói rằng điều gì đó luôn luôn đúng ngay cả khi có một trường hợp duy nhất từ chối nó. Nếu Itzik và những người khác có thể tìm thấy những con bọ đơn độc như thế này, thì ít nhất nó cũng có khả năng có những con bọ khác. Và vì chúng tôi không biết phần còn lại của truy vấn của OP, chúng tôi không thể nói chắc chắn rằng anh ấy sẽ dựa vào sự ngắn mạch này nhưng cuối cùng lại bị nó cắn. Vì vậy, với tôi, câu trả lời an toàn hơn là:
Mặc dù bạn thường có thể dựa vào CASE
để đánh giá từ trái sang phải và ngắn mạch, như được mô tả trong tài liệu, không chính xác để nói rằng bạn luôn có thể làm như vậy. Có hai trường hợp được chứng minh trên trang này là không đúng sự thật và không có lỗi nào được sửa trong bất kỳ phiên bản SQL Server công khai nào.
EDIT ở đây là một trường hợp khác (tôi cần dừng thực hiện điều đó) khi một CASE
biểu thức không đánh giá theo thứ tự bạn mong đợi, mặc dù không có tổng hợp nào được tham gia.
CASE
luôn đánh giá từ trái sang phải và luôn ngắn mạch ).