【问题标题】:Why doesn't Raiserror get invoked?为什么不调用 Raiserror?
【发布时间】:2019-03-18 09:46:54
【问题描述】:

如果我在事务中有这个块:

Begin Try
  Begin Transaction tran


    Declare @ExpiryDate varchar(100)
        Set @ExpiryDate= (Select NewExpiryDate from NIT n where n.NITNo= @NitNo)
        IF(CONVERT(DATE,@ExpiryDate)) < convert(date,getdate())
        Begin
                RAISERROR('error occurred', 16,1);
                return;
        End

  Commit Transaction tran
End Try
Begin Catch
                select ERROR_MESSAGE()

                Rollback transaction tran1
End Catch

...它到达了 catch 块,但永远不会引发错误。它从不抛出错误。为什么?

【问题讨论】:

  • 如果try 块中有错误并且catch 块被执行,那么为什么它会RaIsError?该语句不在catch 块中。旁白:看起来你也在使用nested transactions。它们的行为可能与您的预期不同。

标签: sql tsql stored-procedures sql-server-2012 subquery


【解决方案1】:

我会改写为:

Begin Try
  Begin Transaction tran;

  Declare @ExpiryDate DATE =(Select NewExpiryDate from NIT where n.NITNo= @NitNo);

  IF @ExpiryDate < convert(date,getdate())
      RAISERROR('error occurred', 16,1);

  Commit Transaction tran;
End Try
Begin Catch
   IF @@TRANCOUNT > 0 Rollback transaction tran1;
   THROW;  -- rethrowing error
End Catch

【讨论】:

  • @PostingQuestions,不工作,你的意思是错误消息不像你的原始代码那样作为结果集返回?如果异常包含相同的信息,为什么要这样做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2020-03-28
  • 2011-05-04
  • 2019-11-04
  • 2016-10-27
  • 2018-05-24
  • 2013-08-12
相关资源
最近更新 更多