1

我正在尝试编写删除客户的 Sybase ASE (15) 存储过程。由于“外键约束违反”,DELETE 可能会失败,在这种情况下,存储过程应该回滚事务并返回。

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 不会引发错误)?

谢谢,西蒙

4

1 回答 1

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

于 2017-07-28T14:17:56.723 回答