Outras respostas apontaram que o CASE é uma expressão , não uma afirmação e, portanto, não pode, por si só, abranger afirmações (como RAISEERROR
qualquer outra). Se as condições não forem muitas - principalmente quando é apenas uma condição -, a instrução SE é a escolha perfeita para o que você está tentando fazer, como também foi mencionado.
No entanto, dependendo do seu cenário, uma expressão CASE ainda pode ser usada, mas não exatamente da maneira que você mostrou. Em particular, se houver muitas condições a serem verificadas em que uma correspondência deve resultar no mesmo conjunto de ações (por exemplo, gerar uma exceção e encerrar o script), você poderá usar uma expressão CASE em uma instrução de atribuição que armazene o resultado do CASE e siga com um FI verificando o resultado armazenado e executando as ações necessárias, se apropriado, da seguinte maneira:
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 */
Nesse caso, a ação necessária está gerando uma exceção, mas a mensagem retornada com a exceção precisa depender de qual condição foi verificada primeiro. A instrução de atribuição usa uma expressão CASE para escolher qual mensagem armazenar na @ErrorMessage
variável.
Você também pode ver que o erro é gerado apenas condicionalmente - somente se a variável realmente contiver uma mensagem para mostrar. Se o valor for uma sequência vazia ou nula, o script continuará sem interrupção.
CASE
- SQL Server possui apenas aCASE
expressão.