gpt4 book ai didi

tsql - 分别在父/子存储过程中打开/关闭 XACT_ABORT 有什么影响?

转载 作者:行者123 更新时间:2023-12-04 18:46:37 26 4
gpt4 key购买 nike

我正在尝试改进当前系统的错误处理以生成更有意义的错误消息。我有一个“根”存储过程,它多次调用其他嵌套存储过程。

在根 sp 中,XACT_ABORT设置为 ON但在嵌套过程中,XACT_ABORT设置为 OFF .我想从较低级别的程序中捕获特定错误,而不是获取根程序的错误。

我经常看到错误,uncommittable transaction is detected at the end of the batch, the transaction is being rolled back.
将这些“混合”环境与 XACT_ABORTs 一起使用是否有任何影响? ?

此外,如果您对高级错误处理有任何建议,将不胜感激。我想我想用 sp_executesql所以我可以传递参数来获取错误输出,而不必修改所有存储过程并使用 RAISERROR调用父过程的 CATCH堵塞。

最佳答案

根据 Andomar's answer hereMSDN:

The setting of SET XACT_ABORT is set at execute or run time and not at parse time



XACT_ABORT不会从创建 session “复制”到每个过程,因此任何未在内部显式设置此选项的 PROC 将在运行时从环境 session 继承设置,这可能是灾难性的。

FWIW,作为一般规则,我们始终确保 XACT_ABORT全局打开并进行 lint 检查以确保我们的 PROC 没有覆盖此设置。

请注意 XACT_ABORT然而,不是 Elixir - 例如已出现的错误 raised by your PROC with RAISERROR不会终止批处理。然而,这似乎通过 THROW keyword in SQL 2012 得到了改善。

正如您所建议的,并按照 Remus Rusanu's observation , 结构化异常处理 (TRY/CATCH) 是一种更加干净和健壮的异常处理机制。

关于tsql - 分别在父/子存储过程中打开/关闭 XACT_ABORT 有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com