T-SQL Supprimer les enregistrements insérés
-
12-11-2019 - |
Question
Je sais que le titre peut sembler étrange, mais c'est ce que je veux faire:
- J'ai une table avec de nombreux enregistrements.
Je veux obtenir certains de ces enregistrements et les insérer dans une autre table. Quelque chose comme ça:
INSERT INTO TableNew SELECT * FROM TableOld WHERE ...
La partie délicate est que je veux que ces lignes que j'ai insérées soient également supprimées de la table d'origine.
Y a-t-il un moyen facile de le faire, car la seule pensée que j'ai réussi à faire est d'utiliser une table temporaire pour enregistrer les enregistrements sélectionnés, puis les mettre dans le deuxième tableau et supprimer les lignes qui correspondent à eux du premier tableau . C'est une solution, mais avec tant de disques (plus de 3 millions et moitié), je recherche une autre idée ...
La solution
En 2005+ Utiliser OUTPUT
clause comme ceci:
DELETE FROM TableOld
OUTPUT DELETED.* INTO TableNew
WHERE YourCondition
Il sera effectué en transaction unique et soit terminé ou reculer simultanément
Autres conseils
Vous pouvez utiliser le insérer ... clause pour stocker les identifiants des lignes copiées dans une table temporaire. Ensuite, vous pouvez supprimer les lignes de la table d'origine en fonction de la table temporaire.
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
Vous devriez faire quelque chose comme ceci:
INSERT INTO "table1" ("column1", "column2", ...)
SELECT "column3", "column4", ...
FROM "table2"
WHERE ...
DELETE FROM "table1"
WHERE ...