我正在创建一个存储过程,其中多个表插入和更新依赖于它们之前的插入。我是否需要做任何事情来确保这些操作完成,(如提交),或者是否在存储过程调用中的插入始终按顺序完成并完成,我什么都不担心?
答案 0 :(得分:2)
你无所畏惧,唯一需要担心的情况是你是否要创建一个永久表(非临时/非变量表)并且之后会插入它。要超过指示表不存在的运行时错误,您必须在创建表之后但在记录插入之前放置“GO”。您始终可以使用“GO”命令确保在此之前继续执行任何代码之前完成到该点的所有过程命令,但在大多数情况下不是必需的。如果执行插入操作,然后在插入完成之后不应评估更新逻辑之后立即执行更新,但如果您想要额外确定,只需弹出它们之间的“GO”,然后就可以了毫无疑问。
答案 1 :(得分: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