Как сгенерировать сообщение и зафиксировать транзакцию с помощью RAISERROR?
Мне нужно использовать RAISERROR, чтобы сгенерировать сообщение (всплывающее сообщение) и зафиксировать эту транзакцию. Есть ли вариант?
Для уровня серьезности 18 транзакция получила откат. Я изменил уровень серьезности на 10 и попробовал как
RAISERROR('Your Reference Number is %s',10,0,@param);
это, но он фиксирует транзакцию, но не показывает сообщение. Что мне нужно здесь, это сообщение должно быть брошено и транзакция должна быть совершена
Любое предложение?
3 ответа
Не используйте исключения для передачи сообщений "ОК". Вы не были бы в AC# или Java-программе. Исключение означает "Я прервал, потому что SHTF"
Вы бы использовали это, чтобы вернуть значимые данные
SELECT 'Your Reference Number is ' + @param
В типичном шаблоне (из моего ответа Вложенные хранимые процедуры, содержащие шаблон TRY CATCH ROLLBACK?)
SET XACT_ABORT, NOCOUNT ON
BEGIN TRY
BEGIN TRANSACTION
[...Perform work, call nested procedures...]
COMMIT TRANSACTION
SELECT 'Your Reference Number is ' + @param
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION
RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
RAISERROR со степенью серьезности выше 10 будет рассматриваться как исключение клиентом ADO.Net. В зависимости от того, как выглядит ваш контекст вызова, это может или не может откат транзакции. Если вы используете SqlTransaction или TransactionScope на клиенте или блок BEGIN TRY/BEGIN CATCH на стороне сервера, это, вероятно, приведет к откату транзакции. Дело в том, что RAISERROR не фиксирует и не откатывает транзакцию, это ваш собственный код, который откатывает или фиксирует, и мы не можем знать, что вы делаете по вашему сообщению.
RAISERROR со степенью серьезности ниже 10 будет считаться информационным сообщением и не станет причиной исключения. См. Серьезность ошибок компонента Database Engine. Вероятно, поэтому вы говорите, что "это не показывает сообщение" (что бы это ни значило). Платформы на стороне клиента обрабатывают информационные сообщения по-разному, например, ADO.Net вызовет SqlConnection.InfoMessage
событие в соединении, но не вызовет исключения. Возможно, в вашем приложении ничего не настроено для этого события, и ваш код просто игнорирует информационные сообщения. Например, как использовать событие InfoMessage, см. Раздел " События подключения (ADO.NET)".
Похоже, вам нужно использовать WITH NOWAIT
параметр для RAISERROR
- это немедленно выведет его в окно сообщения:
RAISERROR('Your Reference Number is %s',10,0,@param) WITH NOWAIT