Andere Antworten haben darauf hingewiesen, dass CASE ein Ausdruck und keine Aussage ist und daher selbst keine Aussagen (wie RAISEERROR
oder andere) umfassen kann. Wenn es nicht viele Bedingungen gibt - insbesondere wenn es sich nur um eine Bedingung handelt -, ist die IF-Anweisung die perfekte Wahl für das, was Sie versuchen, wie bereits erwähnt.
Abhängig von Ihrem Szenario kann dennoch ein CASE-Ausdruck verwendet werden, nur nicht genau so, wie Sie es gezeigt haben. Insbesondere wenn viele Bedingungen überprüft werden müssen, unter denen eine Übereinstimmung zu denselben Aktionen führen sollte (z. B. Auslösen einer Ausnahme und Beenden des Skripts), können Sie einen CASE-Ausdruck in einer Zuweisungsanweisung verwenden, in der das CASE-Ergebnis gespeichert ist, und dann folgen es mit einer IF, die das gespeicherte Ergebnis überprüft und gegebenenfalls die erforderlichen Aktionen ausführt, wie folgt:
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 diesem Fall löst die erforderliche Aktion eine Ausnahme aus, aber die mit der Ausnahme zurückgegebene Nachricht muss davon abhängen, welche Bedingung zuerst überprüft wurde. Die Zuweisungsanweisung verwendet einen CASE-Ausdruck, um auszuwählen, welche Nachricht in der @ErrorMessage
Variablen gespeichert werden soll.
Sie können auch sehen, dass der Fehler nur bedingt ausgelöst wird - nur wenn die Variable tatsächlich eine anzuzeigende Nachricht enthält. Wenn der Wert eine leere Zeichenfolge oder eine Null ist, wird das Skript ohne Unterbrechung fortgesetzt.
CASE
- SQL Server hat nur denCASE
Ausdruck.