So kopieren Sie eine Zeile von einer SQL Server-Tabelle in eine andere

90

Ich habe zwei identische Tabellen und muss Zeilen von einer Tabelle in eine andere kopieren. Was ist der beste Weg das zu tun? (Ich muss nur einige Zeilen programmgesteuert kopieren, ich muss das Dienstprogramm für Massenkopien nicht verwenden.)

rp.
quelle

Antworten:

119

Solange es keine Identitätsspalten gibt, können Sie einfach

INSERT INTO TableNew
SELECT * FROM TableOld
WHERE [Conditions]
Scott Nichols
quelle
22
Seien Sie vorsichtig mit dieser Syntax, da sie nicht funktioniert, wenn Tabelle2 eine Identitätsspalte hat, und sie in Zukunft unterbrochen wird, wenn sich Tabelle1 jemals ändert, ohne dass sich Tabelle2 synchron ändert (hat mich zuvor gebrannt). Diese Lösung ist möglicherweise perfekt für Ihren Fall. Beachten Sie jedoch diese Überlegungen.
Michael Haren
10
Sie können SET IDENTITY_INSERT < table > ON(und SET IDENTITY_INSERT < table > OFF) verwenden, um die Identitätsspalte in der Tabelle, in die Sie einfügen möchten, vorübergehend zu deaktivieren. Ich habe versucht, ein paar fehlende Datensätze in der Mitte des Datensatzes wiederherzustellen.
Nickb
1
Was ist, wenn der Primärschlüssel in Tabelle1 in Tabelle2 als Fremdschlüssel vorhanden ist? Ich habe das gleiche und weiß nicht, was ich tun soll. In Tabelle 2 ist der Fremdschlüssel AS "Technology_idTechnology" und in Tabelle 1 als "idTechnology" angegeben. Ich möchte alle Einträge von Tabelle 1 nach kopieren Tabelle2, wenn die idTechnology in beiden Tabellen
übereinstimmt
71

Alternative Syntax:

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

Die Auswahlabfrage kann (natürlich) Ausdrücke, case-Anweisungen, Konstanten / Literale usw. enthalten.

Michael Haren
quelle
2
Dies ist großartig, wenn sich die Tabellen geringfügig unterscheiden. Ich habe ein paar zusätzliche Spalten in meiner zweiten Tabelle und die akzeptierte Antwort funktioniert nicht mit MSSQL, da sie identisch sein müssen.
Tony M
39

Jarretts Antwort erstellt eine neue Tabelle.

Scotts Antwort wird in eine vorhandene Tabelle mit derselben Struktur eingefügt.

Sie können auch in eine Tabelle mit unterschiedlicher Struktur einfügen:

INSERT Table2
(columnX, columnY)
SELECT column1, column2 FROM Table1
WHERE [Conditions]
ScottStonehouse
quelle
6
@ScottStonehouse: Wenn Sie alle anderen Antworten in dieser Antwort sammeln, wie Sie es getan haben, aber mit Code (der sie umfassend macht), werden Sie definitiv die beste Antwort.
Michael Haren
6
INSERT INTO DestTable
SELECT * FROM SourceTable
WHERE ... 

funktioniert in SQL Server

Kaniu
quelle
2
Dies funktioniert nur, wenn DestTable nicht vorhanden ist. Sie erhalten eine Fehlermeldung, wenn DestTable vor dieser Abfrage erstellt wird.
Ein Web-Entwickler
2
Tatsächlich schlägt es fehl, wenn die Zieltabelle nicht vorhanden ist. Dies kann zu Fehlern führen, wenn die vorhandene DestTable nicht leer ist.
Kaniu
5
SELECT * INTO < new_table > FROM < existing_table > WHERE < clause >
Jarrett Meyer
quelle
1
Gibt es eine Möglichkeit, dies zu tun, wenn sich diese beiden Tabellen in verschiedenen Datenbanken in SQL Server befinden?
Naresh
9
Sicher! Qualifizieren Sie einfach die Datenbank vollständig. [Servername]. [Schema]. [Tabelle]. Zum BeispielSELECT * INTO [SQLTEST].[dbo].[EMPLOYEES] FROM [SQLPROD].[dbo].[EMPLOYEES]
Jarrett Meyer
4
Dadurch wird eine neue Tabelle erstellt, nach der das OP nicht fragt.
Conrad