Comment copier une ligne d'une table SQL Server vers une autre

91

J'ai deux tables identiques et j'ai besoin de copier des lignes d'une table à une autre. Quelle est la meilleure façon de le faire? (J'ai besoin de copier par programme juste quelques lignes, je n'ai pas besoin d'utiliser l'utilitaire de copie en bloc).

rp.
la source

Réponses:

120

Tant qu'il n'y a pas de colonnes d'identité, vous pouvez simplement

INSERT INTO TableNew
SELECT * FROM TableOld
WHERE [Conditions]
Scott Nichols
la source
23
Soyez prudent avec cette syntaxe car elle ne fonctionnera pas si Table2 a une colonne d'identité et elle se cassera à l'avenir si Table1 change jamais sans que Table2 ne change en synchronisation (m'a brûlé avant). Cette solution pourrait être parfaite pour votre cas, soyez simplement conscient de ces considérations.
Michael Haren
11
Vous pouvez utiliser SET IDENTITY_INSERT < table > ON(et SET IDENTITY_INSERT < table > OFF) pour désactiver temporairement la colonne d'identité sur la table dans laquelle vous essayez d'insérer. J'ai travaillé pour moi en essayant de restaurer quelques enregistrements manquants au milieu de l'ensemble de données.
nickb
1
que se passe-t-il si la clé primaire de la table1 existe dans la table2 en tant que clé étrangère? J'ai la même chose, et je ne sais pas quoi faire .. dans la table2 id la clé étrangère AS "Technology_idTechnology" et dans la table 1, elle est là comme "idTechnology" Je veux copier toutes les entrées de table1 vers table2, lorsque l'idTechnology correspond dans les deux tables ..
ZelelB
71

Syntaxe alternative:

INSERT tbl (Col1, Col2, ..., ColN)
  SELECT Col1, Col2, ..., ColN
  FROM Tbl2
  WHERE ...

La requête de sélection peut (bien sûr) inclure des expressions, des instructions de cas, des constantes / littéraux, etc.

Michael Haren
la source
2
C'est génial lorsque les tableaux diffèrent légèrement. J'ai quelques colonnes supplémentaires dans mon deuxième tableau et la réponse acceptée ne fonctionne pas avec MSSQL car elles doivent être identiques.
Tony M
39

La réponse de Jarrett crée une nouvelle table.

La réponse de Scott s'insère dans une table existante avec la même structure.

Vous pouvez également insérer dans un tableau avec une structure différente:

INSERT Table2
(columnX, columnY)
SELECT column1, column2 FROM Table1
WHERE [Conditions]
ScottStonehouse
la source
6
@ScottStonehouse: si vous rassemblez toutes les autres réponses dans cette réponse comme vous l'avez fait mais avec du code (le rendant complet), vous deviendriez certainement la meilleure réponse.
Michael Haren
6
INSERT INTO DestTable
SELECT * FROM SourceTable
WHERE ... 

fonctionne dans SQL Server

Kaniu
la source
2
Cela ne fonctionne que lorsque DestTable n'existe pas. Vous obtiendrez une erreur si DestTable est créé avant cette requête.
Un développeur Web
2
En fait, il échoue si la table de destination n'existe pas. Cela peut provoquer des erreurs si le DestTable existant n'est pas vide.
Kaniu
5
SELECT * INTO < new_table > FROM < existing_table > WHERE < clause >
Jarrett Meyer
la source
1
Y a-t-il un moyen de le faire si ces deux tables sont dans des bases de données diff dans sql-server.
Naresh
9
Sûr! Qualifiez simplement la base de données. [nom du serveur]. [schéma]. [table]. Par exempleSELECT * INTO [SQLTEST].[dbo].[EMPLOYEES] FROM [SQLPROD].[dbo].[EMPLOYEES]
Jarrett Meyer
4
Cela crée une nouvelle table, ce qui n'est pas ce que le PO demande.
Conrad le