Altre risposte hanno sottolineato che CASE è un'espressione , non un'affermazione, e quindi non può di per sé racchiudere le dichiarazioni (come RAISEERROR
o qualsiasi altra). Se le condizioni non sono molte, in particolare quando si tratta di una sola condizione, l'istruzione IF è la scelta perfetta per ciò che si sta tentando di fare, come è stato anche menzionato.
Tuttavia, a seconda del tuo scenario, è ancora possibile utilizzare un'espressione CASE, non esattamente come mostrato. In particolare, se ci sono molte condizioni da verificare in cui una corrispondenza dovrebbe comportare lo stesso insieme di azioni (ad esempio, sollevare un'eccezione e terminare lo script), è possibile utilizzare un'espressione CASE in un'istruzione di assegnazione che memorizza il risultato del CASE, quindi seguire con un IF che controlla il risultato memorizzato ed esegue le azioni richieste, se del caso, in questo modo:
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 */
In questo caso, l'azione necessaria genera un'eccezione, ma il messaggio restituito con l'eccezione deve dipendere dalla condizione verificata per prima. L'istruzione di assegnazione utilizza un'espressione CASE per scegliere quale messaggio archiviare nella @ErrorMessage
variabile.
Puoi anche vedere che l'errore viene generato solo in modo condizionale, solo se la variabile contiene effettivamente un messaggio da mostrare. Se il valore è una stringa vuota o nulla, lo script continuerà senza interruzioni.
CASE
- SQL Server ha solo l'CASE
espressione.