Rollback der gesamten SQL-Einfügung, falls etwas fehlschlägtIch versuche, mehrere Einfügungen in verschiedenen Tabellen auszuführen, und ich möchte, dass sie alle zurückgesetzt werden, wenn etwas fehlschlägt. Jetzt habe ich den SQL-Code, der läuft, und es wird korrekt zurückgerollt, aber der Fehler wird nicht über ODBC ausgelöst. JMP gibt nur einen fehlenden Wert zurück. Weiß jemand, wie man sicherstellt, dass der raiserror () korrekt über ODBC angezeigt wird? Wenn ich den gleichen Code direkt in SQL ausführen, wird der Fehler korrekt ausgelöst.
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);
Re: Rollback der gesamten SQL-Einfügung, falls etwas fehlschlägt @ vince_faller Ich halte mich immer noch für einen SQL-Hacker, also keinen Experten. Wenn Sie sich nur Ihre SQL ansehen und wissen, dass ein BEGIN TRAN mit einem COMMIT TRAN oder einem ROLLBACK TRAN endet, sollte der SELECT-Abschnitt von SQL zum Erfassen der Fehlermeldungen vor dem ROLLBACK-Vorgang erscheinen.
Dies ist nur eine wilde Vermutung. Bitte posten Sie, wenn Sie eine Lösung finden.
Re: Rollback der gesamten SQL-Einfügung, falls etwas fehlschlägtKeine Liebe. Immer noch nichts zurückbekommen.
Re: Rollback der gesamten SQL-Einfügung, falls etwas fehlschlägtDies ist eine grobe Lösung, aber bevor Sie Ihre Transaktion durchführen, fügen Sie einen Wert in eine Statustabelle wie "Verarbeitung" ein und bestätigen Sie diesen.
Dann machen Sie Ihre Transaktion. Ändern Sie nach dem Festschreiben den Statustabellenwert in "Fertig". Wenn Ihre Transaktionen fehlschlagen und Sie zum Rollback-Bereich springen, wird in Ihrer Statustabelle weiterhin "Verarbeitung" angezeigt. Überprüfen Sie also nach dem Aufruf Ihrer Haupttransaktionen Ihre Statustabelle. Wenn immer noch "Verarbeitung" angezeigt wird, wissen Sie, dass ein Rollback durchgeführt wurde.