Rollen Sie nicht ab, um eine Löschabfrage abzubrechen

Gibt es eine Möglichkeit, den Rollback zu deaktivieren, wenn eine Löschabfrage abgebrochen wird? Also, welche Zeilen, wo gelöscht, gelöscht werden und diejenigen, die nicht gelöscht werden, bleiben dort?

Ich weiß, es bricht SÄURE, aber ich habe einen Fehler gemacht und es ist schon 3 Stunden storniert diese Abfrage … und ich möchte nicht, dass diese Zeilen zurückgegeben werden. Nur so, dass in der Zukunft, wenn dies wieder passiert, werde ich nicht sperren den Tisch, wenn ich abbrechen.

Vielen Dank!

Nicht direkt nein

Was im Allgemeinen funktioniert, besteht darin, das Löschen in Chargen aufzuteilen und eine WHILE loop auszuführen, bis alles fertig ist:

 SET ROWCOUNT 10000 SELECT top 1 * from sys.objects --prime ROWCOUNT WHILE @@ROWCOUNT > 0 BEGIN DELETE FROM TABLExxx WHERE 1=0 --Delete conditions END 

Das wird 10000 1 Zeilen zu einem timepunkt zu löschen, so dass, wenn Sie abbrechen Sie nur ein bisschen von Ihrer Arbeit rückgängig machen.


1 10000 ist ganz willkürlich – vielleicht möchtest du das nach oben oder unten auf deiner eigenen data abstimmen, wie lange jede Charge dauert und wie viel Arbeit du glücklich bist zu verlieren, wenn du das Skript stornst.

Ich weiß, Sql server hasst Cursor, aber das scheint wie eine gute time, um eins zu versuchen. Hier gibt es mehrere Vorteile, die die zusätzliche Bearbeitungszeit weit überwiegen würden:

  • Sie löschen offensichtlich eine sehr große Anzahl von Zeilen. Dies geschieht in einer delete statement, die vermutlich die gesamte Tabelle für eine lange time (über einen bestimmten Punkt hinaus, Sql server überspringt Zeilensperre und nur versuchen, die ganze Tabelle zu sperren). Das Löschen der Zeilen zu einem timepunkt entlastet diese Sperrung.
  • Sie können das delete innerhalb eines try innerhalb einer loop haben. Wenn ein Fehler auftritt, schreiben Sie die Details in eine Protokolltabelle. Dies wird Ihnen dringend benötigte Informationen über das, was den Fehler verursacht, so können Sie herausfinden, wie man es beheben.
  • Am Ende haben Sie gelöscht und alle Zeilen, die gelöscht werden können, und Sie haben eine Aufzeichnung nur der problematischen datasatz (s). Es geht nicht besser als das.
  • Cursors sind langsam? Ja, aber wenn du einen benutzt hättest, hättest du schon vor langer time fertig.

Ich weiß, dass Sql server-Entwickler Cursor als Evil Incarnate betrachten . Sie sind nicht. Sie sind ein Werkzeug und wie jedes Werkzeug sollte enthusiastisch verwendet werden, wenn die Vorteile die Kosten überwiegen.