4

我正在制作一个存储过程,其中几个表插入和更新依赖于它们之前的插入。我是否需要做任何事情来确保这些操作完成(比如提交),或者存储过程调用中的插入总是按顺序完成和完成,我什么都不担心?

4

2 回答 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 回答