83 votes

Déplacer des données SQL d'une table à une autre

Je me demandais s'il était possible de déplacer toutes les lignes de données d'une table à l'autre, qui correspondent à une certaine requête ?

Par exemple, j'ai besoin de déplacer toutes les lignes de table de Table1 vers Table2 où leur nom d'utilisateur = 'X' et leur mot de passe = 'X', afin qu'elles n'apparaissent plus dans Table1.

J'utilise SQL Server 2008 Management Studio.

142voto

Thorsten Points 4986

Cela devrait être possible en utilisant deux instructions dans une transaction, une insertion et une suppression :

BEGIN TRANSACTION;
INSERT INTO Table2 (<columns>)
SELECT <columns>
FROM Table1
WHERE <condition>;

DELETE FROM Table1
WHERE <condition>;

COMMIT;

C'est la forme la plus simple. Si vous devez vous préoccuper de l'insertion de nouveaux enregistrements correspondants dans table1 entre les deux instructions, vous pouvez ajouter une balise and exists <in table2> .

57voto

that0th3rGuy Points 337

C'est un ancien message, désolé, mais je ne suis tombé dessus que maintenant et je voulais donner ma solution à ceux qui pourraient tomber dessus un jour.

Comme certains l'ont mentionné, effectuer un INSERT et ensuite un DELETE pourrait entraîner des problèmes d'intégrité, alors peut-être qu'un moyen de contourner ce problème, et de tout réaliser proprement en une seule déclaration, est de tirer parti de la fonction [deleted] table temporaire.

DELETE FROM [source]
OUTPUT [deleted].<column_list>
INTO [destination] (<column_list>)

23voto

Ken Sands Points 51

Toutes ces réponses exécutent la même requête pour l'INSERT et le DELETE. Comme mentionné précédemment, le DELETE risque de récupérer les enregistrements insérés entre les déclarations et peut être lent si la requête est complexe (bien que les moteurs intelligents "devraient" rendre le deuxième appel rapide).

La méthode correcte (en supposant que l'INSERT est effectué dans une nouvelle table) consiste à effectuer le DELETE dans la table 1 en utilisant le champ clé de la table 2.

La suppression devrait être :

DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)

Excusez ma syntaxe, je passe d'un moteur à l'autre, mais vous voyez l'idée.

10voto

GreySage Points 599

Une représentation plus nette de ce que certaines autres réponses ont laissé entrevoir :

DELETE sourceTable
OUTPUT DELETED.*
INTO destTable (Comma, separated, list, of, columns)
WHERE <conditions (if any)>

10voto

pirho Points 1387

Oui, c'est ça. D'abord INSERT + SELECT et ensuite DELETE orginaux.

INSERT INTO Table2 (UserName,Password)
SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X'

puis supprimer les orginaux

DELETE FROM Table1 WHERE UserName='X' AND Password='X'

vous pourriez vouloir préserver UserID ou une autre clé primaire, alors vous pouvez utiliser IDENTITY INSERT pour préserver la clé.

voir plus sur SET IDENTITY_INSERT sur MSDN

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X