La mia opinione su questo è che la documentazione chiarisca ragionevolmente che l' intenzione è che CASE sia in corto circuito. Come menziona Aaron, ci sono stati diversi casi (ha!) In cui questo ha dimostrato di non essere sempre vero.
Finora, tutti questi sono stati riconosciuti come bug e risolti, anche se non necessariamente in una versione di SQL Server è possibile acquistare e correggere oggi (il bug a costante costante non è ancora arrivato a un aggiornamento cumulativo AFAIK). L'ultimo potenziale bug - originariamente segnalato da Itzik Ben-Gan - deve ancora essere esaminato (o Aaron o lo aggiungeremo a Connect a breve).
Relativamente alla domanda originale, ci sono altri problemi con CASE (e quindi COALESCE) in cui vengono utilizzate funzioni con effetti collaterali o sottoquery. Tener conto di:
SELECT COALESCE((SELECT CASE WHEN RAND() <= 0.5 THEN 999 END), 999);
SELECT ISNULL((SELECT CASE WHEN RAND() <= 0.5 THEN 999 END), 999);
Il modulo COALESCE restituisce spesso NULL, maggiori dettagli su https://connect.microsoft.com/SQLServer/feedback/details/546437/coalesce-subquery-1-may-return-null
I problemi dimostrati con le trasformazioni dell'ottimizzatore e il tracciamento delle espressioni comuni significano che è impossibile garantire che CASE eseguirà il cortocircuito in tutte le circostanze. Sono in grado di concepire casi in cui potrebbe non essere nemmeno possibile prevedere il comportamento ispezionando l'output del piano dello spettacolo pubblico, anche se oggi non ho una replica per questo.
In sintesi, penso che tu possa essere ragionevolmente fiducioso che CASE eseguirà un cortocircuito in generale (in particolare se una persona abbastanza qualificata ispeziona il piano di esecuzione e che il piano di esecuzione viene 'applicato' con una guida o suggerimenti per il piano) ma se è necessario una garanzia assoluta, devi scrivere SQL che non includa affatto l'espressione.
Non uno stato di cose estremamente soddisfacente, immagino.
CASE
valuta sempre da sinistra a destra e sempre cortocircuiti ).