我只是学习存储过程,并且已经对该主题进行了相当多的阅读(所以道歉可以重复)但是还没有找到一个明确的答案,如下所示的几个建议的最佳实践:
{{1}} = try / catch块会替换它吗? [对于简单的非嵌套存储过程,甚至还需要回滚吗?]
对于没有返回值的存储过程(例如插入),如果有什么东西应该返回给调用者(如果失败则显然是错误,但如果成功则会失败,尤其是在使用{{1}}时)?
答案 0 :(得分:3)
返回什么将取决于您的业务需求。一般来说,我们只返回错误,但其他公司/流程有不同的需求。
有时我们使用输出参数来发送一些值,这些值可能会在以后执行许多存储过程的长复杂过程中使用。如果您有很多条件逻辑来告诉在当前情况下运行其他触发器,则尤其如此。
要清楚,return应返回错误或成功信息,输出应返回您打算在稍后的过程中执行某些操作或在应用程序中显示的实际数据(例如人员ID)。如果您有多个标量值返回到调用进程,请使用select而不是输出变量。不要尝试使用Return返回运行状态以外的任何内容,并且不要尝试使用输出来返回多个记录。
如果您决定使用Try Catch处理回滚并执行明确的步骤,那么您应该考虑一件事情,如果您已将信息放入表变量中然后不回滚但是插入到常规表或临时表中的任何数据都会是。这意味着如果你想记录你的步骤或错误,你应该在一个表变量中,所以它们可以在提交或回滚后插入到日志表中。
如果您要编写任何复杂的任何步骤和变量,请自己帮个忙并添加一个@test输入变量,以便您可以在测试模式(和回滚)中运行它并在关键点,看看你的变量值或者insert语句可能使用的结果等等。这将极大地帮助您确定在插入步骤失败时您尝试插入的确切信息。如果你花费额外的一个小时左右来做这件事,你将节省数百小时来弄清楚为什么后来的错误。
答案 1 :(得分:2)
回答问题1:
当SET XACT_ABORT
设置为ON
时,如果您想控制此行为,它会在发生错误时立即回滚事务(您决定何时回滚,何时不回滚,哪个是个人喜欢),只需使用TRY..CATCH
块并控制自己出错,如果出现问题,尝试在TRY BLOCK中执行操作控制跳转到Catch块,在那里明确回滚事务,执行其他操作错误记录并出来tada .....
回答问题2:
使用OUTPUT
参数返回@SuccessStatus
之类的值,如果发生错误,则使用其他输出参数返回某种错误消息等,OUTPUT参数是您的朋友,明智地使用它们。