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
War es hilfreich?

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 +

verwenden

Edit: 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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top