2012-01-23 22 views
5

Sé que el título puede parecer extraño, pero esto es lo que quiero hacer:T-SQL Eliminar registros insertados

  1. tengo mesa con muchos registros.
  2. Quiero obtener algunos de estos registros e insertarlos en otra tabla. Algo como esto:

    INSERT INTO TableNew SELECT * FROM TableOld WHERE ...

  3. La parte difícil es que quiero esta filas que he insertado a ser borrados forma la tabla origen también.

¿Hay una manera fácil de hacer esto, porque la única piensan que he logrado hacer es utilizar una tabla temporal para guardar los registros seleccionados y luego ponerlos en la segunda tabla y eliminar filas que partido con ellos de la primera mesa. Es una solución, pero con tantos registros (más de 3 millones y medio) Busco a alguna otra idea ...

+0

versión de SQL Server? –

+1

usa la cláusula OUTPUT ... –

Respuesta

13

En 2005+ uso OUTPUT cláusula como esto:

DELETE FROM TableOld 
OUTPUT DELETED.* INTO TableNew 
WHERE YourCondition 

se lleva a cabo en una sola operación y, o bien completa o retroceder simultáneamente

+0

No sé si puedo resucitar esto, pero ¿hay alguna manera de hacerlo cuando tenga una columna de identidad en las tablas de origen y de destino? – intA

0

Usted debe hacer algo como esto:

INSERT INTO "table1" ("column1", "column2", ...) 
SELECT "column3", "column4", ... 
FROM "table2" 
WHERE ... 

DELETE FROM "table1" 
WHERE ... 
+2

¿QUÉ es ELIMINAR? –

2

puede utilizar el insert ... output cláusula para almacenar las identificaciones de las filas copiadas en una tabla temporal. Luego puede eliminar las filas de la tabla original en función de la tabla temporal.

declare @Table1 table (id int, name varchar(50)) 
declare @Table2 table (id int, name varchar(50)) 

insert @Table1 (id,name) 
      select 1, 'Mitt' 
union all select 2, 'Newt' 
union all select 3, 'Rick' 
union all select 4, 'Ron' 


declare @copied table (id int) 

insert @Table2 
     (id, name) 
output inserted.id 
into @copied 
select id 
,  name 
from @Table1 
where name <> 'Mitt' 

delete @Table1 
where id in 
     (
     select id 
     from @copied 
     ) 

select * 
from @Table1 

Working example at Data Explorer.

Cuestiones relacionadas