我有一个存储过程,我需要只提交ERROR_LOG表,如果有任何错误或者我们在任何进程之间终止该过程。在这种情况下,除了ERROR_LOG表插入之外,所有其他更改都必须回滚。
如何实施?
答案 0 :(得分:1)
由于表格变量不参与交易,您可以使用此事实来实现目标:
DECLARE @ErrorLog TABLE ( ID INT )
BEGIN TRANSACTION
INSERT INTO @ErrorLog
( ID )
VALUES ( 1 ),
( 2 )
ROLLBACK TRANSACTION
SELECT *
FROM @ErrorLog
输出:
ID
1
2
因此,在您的存储过程中,而不是插入实际表插入到表变量中,并在错误时插入到实际表中:
CREATE PROCEDURE spTest
AS
BEGIN TRY
DECLARE @ErrorLog TABLE(...)
BEGIN TRANSACTION
INSERT INTO @ErrorLog VALUES(...)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
INSERT INTO ErrorLog SELECT * FROM @ErrorLog
END CATCH