Bagaimana dengan yang ini - seperti yang dilaporkan kepada saya oleh Itzik Ben-Gan, yang diberitahu tentang itu oleh Jaime Lafargue ?
DECLARE @i INT = 1;
SELECT CASE WHEN @i = 1 THEN 1 ELSE MIN(1/0) END;
Hasil:
Msg 8134, Level 16, State 1, Line 2
Divide by zero error encountered.
Tentu saja ada penyelesaian yang sepele, tetapi intinya tetap CASE
saja tidak selalu menjamin evaluasi dari arus pendek ke kanan / hubungan arus pendek. Saya melaporkan bug di sini dan ditutup sebagai "sesuai desain." Paul White kemudian mengajukan item Connect ini , dan ditutup sebagai Fixed. Bukan karena itu diperbaiki sendiri, tetapi karena mereka memperbarui Buku Online dengan deskripsi yang lebih akurat dari skenario di mana agregat dapat mengubah urutan evaluasi CASE
ekspresi. Baru-baru ini saya membuat blog lebih banyak tentang ini di sini .
EDIT hanya sebuah tambahan, sementara saya setuju bahwa ini adalah kasus tepi, bahwa sebagian besar waktu Anda dapat mengandalkan evaluasi kiri-ke-kanan dan hubungan arus pendek, dan bahwa ini adalah bug yang bertentangan dengan dokumentasi dan mungkin pada akhirnya akan diperbaiki ( ini tidak pasti - lihat percakapan tindak lanjut di posting blog Bart Duncan untuk mengetahui alasannya), saya harus tidak setuju ketika orang mengatakan bahwa sesuatu selalu benar bahkan jika ada kasus tepi tunggal yang membantahnya. Jika Itzik dan yang lainnya dapat menemukan bug soliter seperti ini, itu membuatnya setidaknya di bidang kemungkinan ada bug lain juga. Dan karena kita tidak tahu sisa dari kueri OP, kita tidak bisa mengatakan dengan pasti bahwa dia akan bergantung pada hubungan arus pendek ini tetapi akhirnya digigit olehnya. Jadi bagi saya, jawaban yang lebih aman adalah:
Meskipun Anda biasanya dapat mengandalkan CASE
untuk mengevaluasi dari kiri ke kanan dan korsleting, seperti dijelaskan dalam dokumentasi, itu tidak akurat untuk mengatakan bahwa Anda selalu dapat melakukannya. Ada dua kasus yang ditunjukkan pada halaman ini di mana itu tidak benar, dan tidak ada bug yang diperbaiki dalam versi SQL Server yang tersedia untuk umum.
EDIT di sini adalah kasus lain (saya harus berhenti melakukan itu) di mana CASE
ekspresi tidak mengevaluasi dalam urutan yang Anda harapkan, meskipun tidak ada agregat yang terlibat.
CASE
selalu mengevaluasi sirkuit dari kiri ke kanan dan selalu pendek) ).