如何以某种方式编写该过程,以便在其中的任何语句出错时我可以ROLLBACK所有INSERT,UPDATE和DELETE语句。
请注意,我的程序可能会也可能没有按顺序列出的陈述。换句话说,我有一个INSERT语句,然后是一些IF逻辑,然后是一个select语句,然后是另一个INSERT,然后是UPDATE,然后是逻辑然后是DELETE语句等。
如果任何语句发生错误,我只想ROLLBACK所有INSERT,UPDATE和DELETE语句。我找到了此代码http://msdn.microsoft.com/en-us/library/ms181299.aspx和http://en.allexperts.com/q/MS-SQL-Server-1801/Rollback-SP.htm
但他们没有回答我的问题。
答案 0 :(得分:4)
如果交易使用XACT_ABORT选项运行,则会自动执行此操作。
set xact_abort on
begin tran
/*Your code*/
commit
这是一个使用此结构化错误处理的interesting question讨论。
答案 1 :(得分:2)
查看TRANSACTION如何工作(您提供的链接也使用它,但由于DTS交互,交易似乎有问题)。基本上,您可以回滚自从您发出启动交易信号后所做的一切。
Martin Smith的answer with xact_abort is desribed in more detail here。
答案 2 :(得分:2)
您所描述的内容称为“数据库事务处理”。它创建了一个在向数据库写入数据方面“全有或全无”的构造。
它创建了一个逻辑框架,其中所有表一起更新,但如果一个表无法更新,则整个事务将回滚到先前的状态。
大多数DB都是这样做的。伪代码如下。
Begin transaction Update Table One Update table Two [Update lots of tables] if all updates successfull commit (All changes to all tables) else rollback (All changes) End transaction
请注意,术语“事务”,“提交”和“回滚”通常也是大多数数据库使用的技术术语。
可能比我更好地解释它的链接。 http://www.subbu.org/articles/nuts-and-bolts-of-transaction-processing
查看您的数据库文档,您应该找到所有这些内容的参考资料。
HTH,如果没有评论,我会再试一次。 : - )