【问题标题】:SQL - When to use @VariableSQL - 何时使用@Variable
【发布时间】:2022-01-05 06:26:48
【问题描述】:

我在网上找到了这段代码:

...
END TRY
BEGIN CATCH
 DECLARE
   @ErMessage NVARCHAR(2048),
   @ErSeverity INT,
   @ErState INT
 
 SELECT
   @ErMessage = ERROR_MESSAGE(),
   @ErSeverity = ERROR_SEVERITY(),
   @ErState = ERROR_STATE()
 
 **RAISERROR (@ErMessage,
             @ErSeverity,
             @ErState )**
END CATCH

我的问题是:在 CATCH 块中,为什么作者必须使用 @ErMessage、@ErServerity、@ErState 声明参数而不仅仅是输入:

RAISERROR (ERROR_MESSAGE(), ERROR_SEVERITY(), ERRORSTATE())

【问题讨论】:

  • 您使用的是哪个 dbms? (上面的代码是特定于产品的。)
  • @jarlh - 我相信 SQL Server。这是我找到代码的地方:sqlhints.com/2013/06/30/…
  • 无论如何,您都应该使用THROW 重新抛出错误 - 如果原始错误是严重性高的错误并且具有文章中可能提到的其他缺点,则编写的RAISERROR 代码可能会失败你链接
  • 事实上,你可能不应该打扰TRY CATCH,除非你真的打算处理错误。就目前而言,您只会弄乱客户端错误处理,因为有时会返回多条消息,您也会丢失错误号。 THROW 也应该只像这样使用 THROW; 所以你重新抛出原来的异常

标签: sql sql-server variables raiserror


【解决方案1】:

对于 SQL Server,这是 discussed here (msdn)(有点旧)。

简而言之:Microsoft 还没有将表达式作为参数进行全面评估。
此外,允许不带分号和一些上下文相关关键字的语句会使其更加复杂。

【讨论】:

    猜你喜欢
    • 2020-09-11
    • 2021-08-17
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多