Как сгенерировать сообщение и зафиксировать транзакцию с помощью RAISERROR? - PullRequest
0 голосов
/ 22 июля 2011

Мне нужно использовать RAISERROR, чтобы сгенерировать сообщение (всплывающее сообщение) и зафиксировать эту транзакцию. Есть ли опция?

Для уровня серьезности 18 транзакция получила откат. Я изменил уровень серьезности на 10 и попробовал как

RAISERROR('Your Reference Number is %s',10,0,@param); 

это, но он фиксирует транзакцию, но не показывает сообщение. Что мне нужно здесь, это сообщение должно быть брошено и транзакция должна быть совершена

Есть предложения?

Ответы [ 3 ]

5 голосов
/ 22 июля 2011

Не используйте исключения для передачи сообщений «ОК».Вы не были бы в AC # или Java-программе.Исключение означает «Я прервал, потому что SHTF»

Вы бы использовали thsi для возврата значимых данных

SELECT 'Your Reference Number is ' + @param

В типичном шаблоне (из моего ответа Вложенные хранимые процедуры, содержащие TRYCATCH 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
5 голосов
/ 22 июля 2011

RAISERROR со степенью серьезности выше 10 будет рассматриваться клиентом ADO.Net как исключение.В зависимости от того, как выглядит ваш контекст вызова, это может или не может откат транзакции.Если вы используете SqlTransaction или TransactionScope на клиенте или блок BEGIN TRY / BEGIN CATCH на стороне сервера, это, вероятно, откатит транзакцию.Дело в том, что RAISERROR не фиксирует и не откатывает транзакцию, это ваш собственный код, который откатывает или фиксирует, и мы не можем знать, что вы делаете из вашего сообщения.

RAISERROR со степенью серьезности ниже 10 будет считаться информационнойсообщение и не вызывает исключений.См. Серьезность ошибок компонента Database Engine .Вероятно, поэтому вы говорите, что «он не показывает сообщение» (что бы ни означало , что означает ).Платформы на стороне клиента обрабатывают информационные сообщения по-разному, например, ADO.Net вызовет событие SqlConnection.InfoMessage в соединении, но не вызовет исключение.Возможно, в вашем приложении ничего не настроено для этого события, и ваш код просто игнорирует информационные сообщения.Например, как использовать событие InfoMessage, см. События подключения (ADO.NET)

0 голосов
/ 22 июля 2011

Звучит так, как будто вам нужно использовать параметр WITH NOWAIT для RAISERROR - это немедленно выведет его в окно сообщения:

RAISERROR('Your Reference Number is %s',10,0,@param) WITH NOWAIT

...