何か失敗した場合は、SQL挿入全体をロールバックします。私は、異なるテーブルに対して複数の挿入を実行しようとしていますが、何かが失敗した場合はそれらすべてをロールバックします。 今私は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);
再:何か失敗した場合は全体のSQL挿入をロールバック @vince_faller 私はまだ自分自身をSQLの "ハッカー"だと思っているので、決して専門家ではありません。SQLを見て、BEGIN TRANがCOMMIT TRANまたはROLLBACK TRANで終わっていることを知っているだけで、エラーメッセージをキャプチャするためのSQLのSELECTセクションは、ROLLBACKの前に発生するはずです。
これは単なる推測です。解決策が見つかったら投稿してください。
再:何か失敗した場合は全体のSQL挿入をロールバック愛じゃない。 まだ何も戻ってこない。
再:何か失敗した場合は全体のSQL挿入をロールバックこれは粗雑な解決策ですが、トランザクションを実行する前に、「処理中」などのステータステーブルに値を挿入し、それをコミットします。
それからあなたの取引をしてください。 コミットしたら、ステータステーブルの値を "Done"に変更します。 トランザクションが失敗してロールバックセクションにジャンプした場合、ステータステーブルにはまだ「処理中」と表示されます。 だからあなたの主なトランザクションの呼び出しの後にあなたのステータステーブルをチェックしてください。 それでも「処理中」と表示されている場合は、ロールバックが実行されたことがわかります。