2013-02-11 65 views
4

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

回答

2

你担心什么,你就需要去关注的,如果说你正在创建一个永久表(非临时/非变量表),并打算做镶入的唯一方案它之后。要通过运行时错误指示表不存在,您必须在创建表之后但在插入记录之前放置“GO”。之后,您可以使用“GO”命令确保所有过程命令都已完成,然后再继续执行任何代码,但在大多数情况下不需要。如果你执行一个插入,然后在插入完成之后不应该评估更新逻辑后立即执行更新,但是如果你想额外确定一下,只需在它们之间插入一个“GO”,然后就可以毫无疑问。

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 
+0

好点,你应该总是有适当的错误处理来补偿运行时错误/失败,但是在干净的场景中,SQL操作按照它们写入的顺序完成。这就是为什么它是一种脚本语言,而不是面向对象。 – 2013-02-11 15:24:12

+0

感谢你们俩。由于缺少处理该数据库的错误,因此我需要更多地使用提交。 我认为'去'声明会给我一些想法,但它听起来像我不需要它。 – KenK 2013-02-11 15:36:06

+0

我是新来的stackoverflow-我应该标记为答案或只有最相关? – KenK 2013-02-11 15:37:31

相关问题