我正在制作一个存储过程,其中几个表插入和更新依赖于它们之前的插入。我是否需要做任何事情来确保这些操作完成(比如提交),或者存储过程调用中的插入总是按顺序完成和完成,我什么都不担心?
问问题
36 次
2 回答
2
您什么都不担心,唯一需要担心的情况是,如果说您正在创建一个永久表(非临时/非变量表)并且之后要对其进行插入。要克服指示表不存在的运行时错误,您必须在表创建之后但在记录插入之前放置一个“GO”。在继续执行任何代码之前,您始终可以使用“GO”命令来确保到该点的所有程序命令都已完成,但在大多数情况下这不是必需的。如果您执行插入,然后在插入完成后立即执行更新,则不应该评估更新逻辑,但如果您想更加确定,只需在它们之间插入“GO”,然后可以毫无疑问。
于 2013-02-11T15:22:16.423 回答
1
如果您有多个语句并希望确保它们全部完成或都不完整,那么您应该使用事务。插入或更新语句失败的原因有很多,因此最好检查一下。
BEGIN TRANSACTION
在您的陈述之前和COMMIT TRANSACTION
之后使用。如果您想取消到目前为止在批处理中完成的任何工作,您也可以调用ROLLBACK TRANSACTION
.
将这些语句包装在TRY/CATCH
块中以尝试优雅地处理任何错误。
BEGIN TRY
BEGIN TRANSACTION
--insert/update statements go here
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH
于 2013-02-11T15:21:51.193 回答