Otras respuestas han señalado que CASE es una expresión , no una declaración, y por lo tanto no puede abarcar declaraciones (como RAISEERRORo cualquier otra). Si las condiciones no son muchas, particularmente cuando es solo una condición, la declaración IF es la elección perfecta para lo que está tratando de hacer, como también se ha mencionado.
Sin embargo, dependiendo de su escenario, una expresión CASE aún podría usarse, pero no exactamente de la manera que ha mostrado. En particular, si hay muchas condiciones para verificar donde una coincidencia debe dar como resultado el mismo conjunto de acciones (por ejemplo, generar una excepción y finalizar el script), puede usar una expresión CASE en una declaración de asignación que almacene el resultado de CASE, luego siga con un IF que verifica el resultado almacenado y realiza las acciones requeridas, si corresponde, de esta manera:
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 */
En este caso, la acción necesaria genera una excepción, pero el mensaje devuelto con la excepción debe depender de qué condición se verificó primero. La instrucción de asignación usa una expresión CASE para elegir qué mensaje almacenar en la @ErrorMessagevariable.
También puede ver que el error se genera solo condicionalmente, solo si la variable realmente contiene un mensaje para mostrar. Si el valor es una cadena vacía o nula, el script simplemente continuará sin interrupción.
CASE: SQL Server solo tiene laCASEexpresión.