T-SQL Eliminar Registros Insertados
-
12-11-2019 - |
Pregunta
Sé que el título puede parecer extraño, pero esto es lo que quiero hacer:
- Tengo mesa con muchos registros.
Quiero obtener algunos de estos registros e insertarlos en otra tabla.Algo como esto:
INSERT INTO TableNew SELECT * FROM TableOld WHERE ...
La parte complicada es que también quiero que estas filas que he insertado se eliminen de la tabla de origen.
¿Hay una manera fácil de hacer esto, porque lo único que he logrado hacer es usar una tabla temporal para guardar los registros seleccionados y luego colocarlos en la segunda tabla y eliminar las filas que coincidan con ellos de la primera tabla?Es una solución, pero con tantos registros( más de 3 millones y medio) estoy buscando alguna otra idea...
Solución
En 2005 + uso OUTPUT
cláusula como esta:
DELETE FROM TableOld
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition
Se realizará en una sola transacción y se completará o revertirá simultáneamente
Otros consejos
Puede usar el insertar ... Salida cláusula para almacenarLa identificación 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
Debes hacer algo como esto:
INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2"
WHERE ...
DELETE FROM "table1"
WHERE ...