如果由於違反外鍵約束而無法成功執行刪除語句,是否有辦法在SQL Server中中止存儲過程?默認情況下,該過程似乎忽略錯誤並繼續下一個語句。在外鍵約束違規中取消存儲過程
但是,對於其他類型的錯誤(例如,從不存在的表中刪除),過程將中止。
示例步驟:
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TestSP]
AS
BEGIN
SET NOCOUNT ON;
print 'BEFORE';
DELETE FROM ExistingWithConstraints;
print 'AFTER DELETE ExistingWithConstraints';
DELETE FROM NonExisting;
print 'AFTER DELETE NonExisting';
END
產生輸出(請注意,上述的最後一個消息不打印):
BEFORE
<snip constraint violation error message>
AFTER DELETE ExistingWithConstraints
<snip invalid object name error message>
如果'@@ TRANCOUNT> 0',您可以使用保存點來回滾由「TestSP」完成的err處理程序修改 - 這是我們在此使用的更通用的模式。 – wqw
@wqw:我自己不使用保存點:數據庫調用應該是原子的。我跟着我的鏈接,你會看到Remus使用這些模板的另一個模板。您還必須小心使用XACT_ABORT,這會導致交易失敗 – gbn