2013-03-20 88 views
1

我试图编写一个删除客户的Sybase ASE(15)存储过程。由于“外键约束冲突”,DELETE可能会失败,在这种情况下,存储过程应回滚事务并返回。正常处理外键约束违规的Sybase ASE SP

CREATE PROCEDURE dbo.spumb_deleteCustomer @customertodelete int AS BEGIN 
    BEGIN TRANSACTION TRX_UMBDELCUSTOMER 

    DELETE CREDITCARDS WHERE CUSTOMERID = @customertodelete 
    DELETE CUSTOMER_SELECTION_MAP WHERE CUSTOMERID = @customertodelete 
    DELETE CUSTOMERS WHERE ID = @customertodelete 
    SELECT @rcnt = @@ROWCOUNT 
    IF (@rcnt <> 1) BEGIN 
    PRINT 'FAILED TO DELETE CUSTOMER' 
    ROLLBACK TRANSACTION TRX_UMBDELCUSTOMER 
    RETURN 
    END 
    COMMIT TRANSACTION TRX_UMBDELCUSTOMER 
END 

在游标中运行此SP时,执行会在第一个无效DELETE后中止。我该如何让光标继续(或者说,SP不会引发错误)?

谢谢,西蒙

回答

0

您应该检查@@ ERROR!= 0表示错误,而不是寻找@@ ROWCOUNT和处理这些错误,否则调用客户端可能会得到意外的消息返回。如果您检查@@ rowcount,则需要在每次删除后立即将其保存到变量中,因为每个命令都会将其重置。

如果你专门找回暖外键冲突的消息,您可以检查@@ ERROR为546或547,因为这些将在@@ ERROR返回时失败:

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00729.1500/html/errMessageAdvRes/BABCCECF.htm

http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00729.1500/html/errMessageAdvRes/BABHJIEC.htm