В других ответах указывалось, что CASE является выражением , а не утверждением, и поэтому не может само по себе охватывать утверждения (как RAISEERROR
и любые другие). Если условий не так много, особенно если это всего лишь одно условие, утверждение IF является идеальным выбором для того, что вы пытаетесь сделать, как уже упоминалось.
Тем не менее, в зависимости от вашего сценария, выражение CASE все еще может использоваться, но не совсем так, как вы показали. В частности, если нужно проверить много условий, когда совпадение должно приводить к одному и тому же набору действий (например, вызвать исключение и завершить сценарий), вы можете использовать выражение CASE в операторе присваивания, хранящем результат CASE, а затем выполнить это с помощью IF, проверяющего сохраненный результат и выполняющего необходимые действия, если необходимо, например, так:
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 */
В этом случае необходимое действие вызывает исключение, но сообщение, возвращаемое с исключением, должно зависеть от того, какое условие было проверено первым. Оператор присваивания использует выражение CASE, чтобы выбрать, какое сообщение хранить в @ErrorMessage
переменной.
Вы также можете видеть, что ошибка возникает только условно - только если переменная действительно содержит сообщение для показа. Если значение является пустой строкой или пустым, сценарий будет продолжаться без прерывания.
CASE
- SQL Server имеет толькоCASE
выражение.