Kann ich Rollback dynamische SQL in SQL Server / TSQL
-
13-09-2019 - |
Frage
Kann ich eine dynamische SQL in einer Transaktion ausführen und Rollback Exec:
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
Setzen Sie diese in einer Transaktion verwenden @@ Fehler nach der exec-Anweisung Rollbacks zu tun.
zB. Code
BEGIN TRANSACTION
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
ELSE
COMMIT TRANSACTION
Wenn es n dynamische SQL-Anweisungen und der Fehler auftritt, in n / 2 wird die erste 1 bis ((n / 2) - 1) aufgerollt werden Aussagen zurück
Fragen über die erste Antwort
@@ Fehler werden den Fehler nicht abholen höchstwahrscheinlich Was bedeutet, dass es nicht den Fehler aufheben könnte, die eine Transaktion bedeutet begehen könnte? Welche Niederlagen der Zweck
try / catch in SQL Server 2005+ Ja, ich bin mit SQL Server 2005, aber nicht den Try-Catch verwendet vor Würde die unter den Trick tun
BEGIN TRANSACTION
BEGIN TRY
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
oder ich sah einige weitere Beispiele im Netz
BEGIN TRY --Start the Try Block..
BEGIN TRANSACTION -- Start the transaction..
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRAN -- Transaction Success!
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN --RollBack in case of Error
RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), 1)
END CATCH
Lösung
Ja. Die TXNs gehören zu der aktuellen Sitzung / Verbindung und dynamische SQL verwenden den gleichen Kontext.
Allerdings @@ ERROR wird der Fehler wahrscheinlich nicht abholen: hat den Status unmittelbar nach der säumige Anweisung überprüft werden. Ich würde try / catch, unter der Annahme, SQL Server 2005 +
verwendenEdit: Der try / catch sollte OK arbeiten
.Andere Tipps
Nehmen Sie nicht unser Wort für es, den Fang versuchen funktioniert, testen Sie es selbst. Da es sich um dynamische SQL die einfachste Sache zu tun, ist die erste Anweisung richtig zu machen (und natürlich ist es mneeds zu Bean Update, einfügen oder löscht, oder es ist nicht nötig atransaction) und dann einen bewussten Syntaxfehler in dem zweiten statment machen. Dann testen Sie, dass der Update Einsatz oder in dem ersten statment löschen ging durch.
Ich möchte auch darauf hinweisen, dass dynamische SQL in der Regel eine schlechte Praxis ist. Ist dies wirklich dynamisch sein müssen?