2009-01-21 12 views
34

Al escribir consultas destructivas (por ejemplo, ELIMINAR o ACTUALIZAR) en SQL Server Management Studio, siempre me da la sensación de querer obtener una vista previa de los resultados de la consulta sin ejecutarla realmente. El acceso muy convenientemente te permite hacer esto, pero prefiero codificar mi SQL a mano, lo cual, por desgracia, Access es muy pobre.¿Cómo puedo obtener una vista previa de una consulta SQL destructiva?

Así que mi pregunta es doble:

  1. ¿Existe un add-on para SSMS, o una herramienta separada que está amueblada con buenas instalaciones de SQL-codificación manual, que también puede previsualizar el resultado de una consulta destructiva , similar a Access?

  2. ¿Existen técnicas o mejores prácticas para hacer vistas previas "a mano"; Por ejemplo, ¿de alguna manera usa transacciones?

Me parece que hacer este tipo de cosas es fundamentalmente importante, pero todavía me parece que no puede encontrar nada a través de Google (Seguramente me estoy en busca de lo que no debía - Soy terriblemente ignorante en este importar). En este momento estoy adoptando un enfoque bastante peludo sobre el uso del cinturón y los corchetes al hacer comentarios para seleccionar/eliminar/actualizar líneas y asegurarme de que hago copias de seguridad. Tiene que haber una mejor manera, seguramente?

¿Alguien puede ayudar?

+0

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

Respuesta

51

me gustaría utilizar la cláusula de salida presente en SQL Server 2008 en adelante ...

OUTPUT Clause (Transact-SQL)

Algo así como ...

BEGIN TRANSACTION 

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

ROLLBACK TRANSACTION 

inserciones y actualizaciones puede utilizar la tabla 'insertada' también. El artículo de MSDN lo cubre todo.

EDIT:

Esto es igual que otras sugerencias de SELECT a continuación, eliminar dentro de una transacción, a excepción de que en realidad hace las dos cosas juntas. Así que abre una transacción, elimina/inserta/actualiza con una cláusula OUTPUT, y los cambios se realizan mientras TAMBIÉN da salida a lo que se hizo. Luego puede elegir deshacer o comprometerse.

+0

Magnífico, eso es exactamente lo que he estado buscando. Gracias. :) –

+0

De nada :) – MatBailie

+0

Prefiero la solución de Kevin porque puede ver los resultados sin cambiar los datos. Seleccionar 100000 registros es mucho mejor para el rendimiento de la base de datos que borrar 100000 registros, generar los resultados de eliminar y luego retrotraer. – HLGEM

2

Cuando se encuentra en el contexto de la transacción, puede deshacer los cambios en cualquier momento antes de comprometer la transacción. (Ya sea llamando a cometer tran explícita o si surge una condición que hará que el servidor de cometer implícitamente la transacción)

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

que viven con el temor de que alguien está haciendo esto a mis bases de datos por lo que siempre pido a mi equipo para hacer algo como lo siguiente:

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 

De esta manera, si golpea accidentalmente F5 (hecho!) Que No haré ningún cambio. Puede resaltar la parte SELECCIONAR hasta el final de la declaración SQL para ver qué registros se modificarán (y cuántos). Luego, resalte BEGIN TRAN y la instrucción Delete completa y ejecútelo. Si elimina la misma cantidad de registros que esperaba, resalte COMMIT TRAN y ejecútelo. Si algo parece poco convincente, resalte ROLLBACK TRAN y ejecútelo.

Lo hago con cualquier instrucción UPDATE o DELETE. Me ha salvado un par de veces, pero SIEMPRE proporciona tranquilidad.

+0

Puse el DELETE y el SELECT al revés para mayor seguridad. –

+2

La razón por la que lo hago en el orden enumerado es para que pueda resaltar la instrucción BEGIN TRAN y la declaración DELETE juntas. Si el DELETE fuera comentado, tendría que hacerlo por separado, pero eso es solo preferencia del desarrollador. Gracias por el comentario. –

+3

Todo esto funciona bien hasta que alguien se olvide de COMPROMETERSE - y termine bloqueando a otros usuarios. Lo he visto muchas veces, así que ten cuidado al usar esta estrategia. –

1

Cuando quiero ver qué se eliminará, simplemente cambio la declaración "eliminar" a "seleccionar *". Me gusta más que usar una transacción porque no tengo que preocuparme por el bloqueo.

+1

Siempre trato de poner cosas en las transacciones de cualquier manera. Por si acaso. Como resaltar todo excepto la cláusula where, presionar f5 y luego mirar fijamente la taza de café vacía ... – MatBailie

4

Al borrar:

BEGIN TRANSACTION 

    DELETE FROM table1 
    OUTPUT deleted.* 
    WHERE property1 = 99 

ROLLBACK TRANSACTION 

Al actualizar/insertar:

BEGIN TRANSACTION 

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

ROLLBACK TRANSACTION 
Cuestiones relacionadas