Завершение оператора SQL с помощью RAISERROR - PullRequest
4 голосов
/ 06 августа 2009

(SQL 2005) Может ли raiserror завершить сохраненный процесс.

Например, в большой системе мы получили значение, которое не ожидалось ввести в определенный столбец. В триггере обновления, если вы напишите:

если существует (выберите * из вставленного, где testcol = 7) начать Повышение ошибки («Моя ошибка», 16, 1) конец

информация об обновлении все еще применяется. Однако если вы запустите

если существует (выберите * из вставленного, где testcol = 7) начать выберите 1/0 конец

выдается ошибка деления на 0, которая фактически завершает обновление. Есть ли способ, как я могу сделать это с помощью повышение ошибки, чтобы я мог получить пользовательские сообщения об ошибках обратно?

Ответы [ 4 ]

6 голосов
/ 06 августа 2009

В триггере введите ROLLBACK, RAISERROR и затем RETURN.

см. Обработка ошибок в SQL Server - контекст триггера от Erland Sommarskog

1 голос
/ 09 ноября 2011
Begin try
@temp number
@temp=1/0
End try
Begin catch
@errormsg varchar(100)
@errormsg=error_massage()
Raiseerror(@errormsg,16,1)
End catch
1 голос
/ 06 августа 2009

Разве вы не можете просто добавить ограничение CHECK к столбцу, чтобы предотвратить его вставку в первую очередь?

ALTER TABLE YourTable ADD CONSTRAINT CK_No_Nasties
    CHECK (testcol <> 7)

В качестве альтернативы вы можете запустить транзакцию в sproc вставки (если она у вас есть) и откатить ее в случае возникновения ошибки. Это может быть реализовано с помощью TRY , CATCH в SQL Server 2005 и позволяет избежать использования триггера.

0 голосов
/ 06 августа 2009

Вы должны проверить действительные данные перед выполнением обновления.

IF (@testvalue = 7)
    RAISERROR("Invalid value.", 16, 1);
ELSE
    UPDATE...
...