2009-01-21 2 views
34

Beim Schreiben von destruktiven Abfragen (z. B. DELETE oder UPDATE) in SQL Server Management Studio habe ich immer den Wunsch, ich könnte eine Vorschau der Ergebnisse der Abfrage anzeigen, ohne sie tatsächlich auszuführen. Der Zugriff ist sehr bequem und erlaubt Ihnen dies zu tun, aber ich bevorzuge es, meinen SQL manuell zu schreiben, was leider sehr schlecht ist.Wie zeige ich eine destruktive SQL-Abfrage in der Vorschau an?

So ist meine Frage zweierlei:

  1. Gibt es ein Add-on für SSMS oder ein separates Tool, das mit guten SQL Hand-Codierung Einrichtungen ausgestattet ist, die auch das Ergebnis einer destruktiven Abfrage kann eine Vorschau , ähnlich wie bei Access?

  2. Gibt es Techniken oder Best Practices für die Vorschauen "von Hand"; z. B. irgendwie Transaktionen verwenden?

Es scheint mir, dass diese Art der Sache zu tun scheinen, kann ich im Grunde wichtig ist aber noch nicht alles über Google zu finden (ich bin für die falsche Sache wahrscheinlich gerade auf der Suche - ich auf diese schrecklich unwissend bin Angelegenheit). Zur Zeit nehme ich einen ziemlich haarigen Gürtel und Zahnspange Ansatz von Kommentieren und Auswahlen/Löschen/Aktualisieren von Zeilen und stellen sicher, dass ich Backups mache. Es muss einen besseren Weg geben, sicher?

Kann jemand helfen?

+0

http://stackoverflow.com/questions/281339/confirm-before-delete-update-in-sql-management -studio – Rockcoder

Antwort

51

ich die OUTPUT-Klausel ab, die in SQL Server 2008 verwenden würde ...

OUTPUT Clause (Transact-SQL)

So etwas wie ...

BEGIN TRANSACTION 

DELETE [table] OUTPUT deleted.* WHERE [woof] 

ROLLBACK TRANSACTION 

Einfügungen und Aktualisierungen können die '' eingeführt Tabelle verwenden. Der MSDN-Artikel deckt alles ab.

EDIT:

Das ist wie andere Vorschläge von SELECT dann innerhalb einer Transaktion DELETE, mit der Ausnahme, dass es tatsächlich tut beides zusammen. So öffnen Sie eine Transaktion, löschen/einfügen/aktualisieren mit einer OUTPUT-Klausel, und die Änderungen werden vorgenommen, während ALSO ausgibt, was getan wurde. Dann können Sie Rollback oder Commit auswählen.

+0

Hervorragend, das ist genau das, was ich gesucht habe. Vielen Dank. :) –

+0

Gern geschehen :) – MatBailie

+0

Ich bevorzuge Kevins Lösung, weil Sie die Ergebnisse sehen können, ohne Daten zu ändern. Wählen Sie 100000 Datensätze ist eine ganze Reihe besser für die Datenbankleistung als löschen 100000 Datensätze, geben Sie die Ergebnisse gelöscht und dann Rollback. – HLGEM

2

Wenn Sie sich im Kontext der Transaktion befinden, können Sie die Änderungen jederzeit zurücksetzen, bevor die Transaktion festgeschrieben wird. (Entweder durch tran explizit commit oder wenn eine Bedingung, die entsteht, wird den Server dazu führen, implizit die Transaktion fest)

create table x (id int, val varchar(10)) 

insert into x values (1,'xxx') 
begin tran 

delete from x 
select * from x 

rollback tran 
select * from x 
22

ich in Angst vor jemandem leben tun dies meine Datenbanken so dass ich immer mein Team fragen so etwas wie die folgenden Funktionen ausführen:

BEGIN TRAN 
  
DELETE FROM X 
-- SELECT * FROM X 
FROM Table A as X JOIN Table B ON Blah blah blah 
WHERE blah blah blah 
  
ROLLBACK TRAN 
COMMIT TRAN 

Auf diese Weise, wenn Sie versehentlich F5 getroffen (es getan!) Sie werde keine Änderungen vornehmen. Sie können den SELECT-Teil am Ende der SQL-Anweisung markieren, um zu sehen, welche Datensätze (und wie viele) geändert werden. Markieren Sie dann die BEGIN TRAN- und die gesamte Delete-Anweisung und führen Sie sie aus. Wenn Sie die gleiche Anzahl an erwarteten Datensätzen löschen, markieren Sie COMMIT TRAN und führen Sie sie aus. Wenn etwas wackelig aussieht, markieren Sie den ROLLBACK TRAN und führen Sie ihn aus.

Ich mache dies mit einer UPDATE oder DELETE-Anweisung. Es hat mich ein paar Mal gerettet, aber es sorgt IMMER für Ruhe.

+0

Ich würde die DELETE und die SELECT umgekehrt für zusätzliche Sicherheit. –

+2

Der Grund, warum ich es in der angegebenen Reihenfolge mache, ist, dass ich den BEGIN TRAN und die DELETE-Anweisung zusammen markieren kann. Wenn die DELETE auskommentiert wären, müsste ich sie separat machen, aber das ist nur die Entwicklerpräferenz. Danke für den Kommentar. –

+3

Das funktioniert alles OK bis jemand vergisst zu COMMIT - und Sie am Ende blockieren andere Benutzer. Ich habe gesehen, dass das zu oft passiert ist, also sei vorsichtig, wenn du diese Strategie verwendest. –

1

Wenn ich sehen möchte, was gelöscht wird, ändere ich einfach die "lösche" Anweisung in ein "select *". Ich mag das besser als eine Transaktion, weil ich mich nicht um Sperren kümmern muss.

+1

Ich versuche immer Dinge in irgendeiner Weise in Transaktionen zu setzen. Nur im Fall. Wie alles zu markieren, außer der Where-Klausel, f5 zu schlagen und dann leer auf die leere Kaffeetasse zu starren ... – MatBailie

4

Beim Löschen:

BEGIN TRANSACTION 

    DELETE FROM table1 
    OUTPUT deleted.* 
    WHERE property1 = 99 

ROLLBACK TRANSACTION 

Bei der Aktualisierung/Einfügen:

BEGIN TRANSACTION 

    UPDATE table1 
    SET table1.property1 = 99 
    OUTPUT inserted.* 

ROLLBACK TRANSACTION 
Verwandte Themen