我正在尝试在不同的表上运行多个插入,如果有任何失败,我希望它们全部回滚。 现在我有sql代码工作,它正在回滚,但它没有提出odbc错误。 JMP只返回一个缺失值。任何人都知道如何确保raiserror()在ODBC上正确显示?如果我直接在SQL中运行相同的代码,它会正确引发错误。
dbc = Create database connection("DRIVER=SQL SERVER;SERVER=.\;Database=Test");
rfail = executeSQL(dbc,
"
DECLARE @TransactionName varchar(20) = 'Transaction1';
BEGIN TRY
BEGIN TRAN @TransactionName
INSERT INTO [dbo].Test1
(A --varchar
,B --Int
)
VALUES
('Test Fail'
,1
)
DECLARE @ID bigint
SELECT @ID = SCOPE_IDENTITY()
INSERT INTO [dbo].Test2
(T1ID --Test1 ID
,A --varchar
)
VALUES
(@ID
,14
)
COMMIT TRAN @TransactionName
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
IF @@TRANCOUNT > 0
ROLLBACK TRAN @TransactionName
SELECT
@ErrorMessage=ERROR_MESSAGE(),
@ErrorSeverity=ERROR_SEVERITY(),
@ErrorState=ERROR_STATE();
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH
",
);
close database connection(dbc);
这是一个粗略的解决方案,但在您执行事务之前,请将值插入状态表(如“Processing”)并提交。
然后做你的交易。 执行提交后,将状态表值更改为“完成”。 如果您的交易失败并且您跳转到回滚部分,您的状态表仍会显示“正在处理”。 因此,在调用主要事务后,请检查您的状态表。 如果仍然显示“正在处理”,您将知道已执行回滚。