2009-01-21 18 views
34

Quando si scrivono query distruttive (ad es. DELETE o UPDATE) in SQL Server Management Studio mi trovo sempre a desiderare di poter visualizzare in anteprima i risultati della query senza eseguirla effettivamente. L'accesso molto comodo ti permette di farlo, ma preferisco codificare a mano il mio SQL che, purtroppo, Access è molto scarso.Come visualizzare in anteprima una query SQL distruttiva?

Quindi la mia domanda è duplice:

  1. v'è un add-on per SQL Server Management Studio, o di uno strumento separato che è arredato con buone SQL strutture codifica manuale che può anche visualizzare in anteprima il risultato di una query distruttiva , simile a Access?

  2. Esistono tecniche o best practice per fare anteprime "a mano"; ad esempio, in qualche modo utilizzando le transazioni?

Mi sembra che fare questo genere di cose è di fondamentale importanza, ma ancora non riesco a trovare nulla tramite Google (probabilmente sto solo cercando la cosa sbagliata - Sono terribilmente ignorante su questo importa). Al momento sto prendendo una cintura piuttosto pelosa e l'approccio di bretelle di commentare dentro e fuori selezionare/eliminare/aggiornare le linee e assicurarmi di fare i backup. Deve esserci un modo migliore, sicuramente?

Qualcuno può aiutare?

+0

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

risposta

51

userei la clausola di uscita presente in SQL Server 2008 in poi ...

OUTPUT Clause (Transact-SQL)

Qualcosa di simile ...

BEGIN TRANSACTION 

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

ROLLBACK TRANSACTION 

di inserimento e aggiornamento può utilizzare la tabella 'inserita' troppo. L'articolo MSDN copre tutto.

EDIT:

Questo è proprio come altri suggerimenti di SELEZIONA quindi eliminare all'interno di una transazione, tranne che in realtà fa due insieme. Quindi apri una transazione, cancella/inserisci/aggiorna con una clausola OUTPUT e le modifiche vengono apportate mentre ANALIZZA l'output di ciò che è stato fatto. Quindi puoi scegliere di eseguire il rollback o il commit.

+0

Superbo, è esattamente quello che stavo cercando. Grazie. :) –

+0

Prego :) – MatBailie

+0

Preferisco la soluzione di Kevin perché puoi vedere i risultati senza modificare i dati. Selezionare 100000 record è un insieme migliore per le prestazioni del database rispetto all'eliminazione di 100000 record, produrre i risultati dell'eliminazione e del rollback. – HLGEM

2

Quando ci si trova nel contesto della transazione, è possibile eseguire il rollback delle modifiche in qualsiasi momento prima che la transazione venga eseguita. (O chiamando commit tran esplicitamente o se una condizione si pone che causerà il server di impegnarsi in modo implicito la transazione)

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

Io vivo nella paura di qualcuno che fa questo per le mie basi di dati in modo da chiedo sempre la mia squadra per fare qualcosa di simile al seguente:

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 

In questo modo, se si ha colpito accidentalmente F5 (fatto!) Voi Non farò cambiamenti. È possibile evidenziare la parte SELECT alla fine dell'istruzione SQL per vedere quali record verranno modificati (e quanti). Quindi, evidenzia BEGIN TRAN e l'intera istruzione Delete ed eseguilo. Se si elimina lo stesso numero di record previsto, evidenziare COMMIT TRAN ed eseguirlo. Se qualcosa sembra fastidioso, evidenzia il ROLLBACK TRAN ed eseguilo.

Lo faccio con qualsiasi istruzione UPDATE o DELETE. Mi ha salvato un paio di volte, ma offre SEMPRE la tranquillità.

+0

Metterei DELETE e SELECT al contrario per maggiore sicurezza. –

+2

Il motivo per cui lo faccio nell'ordine elencato è tale da consentire di evidenziare insieme BEGIN TRAN e l'istruzione DELETE. Se il DELETE fosse commentato, dovrei farlo separatamente, ma questa è solo la preferenza degli sviluppatori. Grazie per il commento. –

+3

Tutto funziona OK finché qualcuno non si dimentica di COMMIT - e finisci per bloccare altri utenti. L'ho visto succedere troppe volte, quindi fai attenzione quando usi questa strategia. –

1

Quando voglio vedere ciò che verrà eliminato, ho appena cambiato l'istruzione "delete" in un "select *". Mi piace meglio dell'utilizzo di una transazione perché non devo preoccuparmi del blocco.

+1

Cerco sempre di mettere le cose nelle transazioni in qualsiasi modo. Nel caso in cui. Come mettere in evidenza tutto tranne la clausola where, colpendo f5 e poi fissando la tazza vuota vuota ... – MatBailie

4

Durante la cancellazione:

BEGIN TRANSACTION 

    DELETE FROM table1 
    OUTPUT deleted.* 
    WHERE property1 = 99 

ROLLBACK TRANSACTION 

caso di aggiornamento/inserimento:

BEGIN TRANSACTION 

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

ROLLBACK TRANSACTION 
Problemi correlati