Jak skopiować wiersz z jednej tabeli programu SQL Server do innej

92

Mam dwie identyczne tabele i muszę skopiować wiersze z tabeli do innej. Jaki jest najlepszy sposób, aby to zrobić? (Muszę programowo skopiować tylko kilka wierszy, nie muszę używać narzędzia do kopiowania zbiorczego).

rp.
źródło

Odpowiedzi:

120

Dopóki nie ma kolumn tożsamości, możesz po prostu

INSERT INTO TableNew
SELECT * FROM TableOld
WHERE [Conditions]
Scott Nichols
źródło
23
Uważaj na tę składnię, ponieważ nie zadziała, jeśli Table2 ma kolumnę tożsamości i zepsuje się w przyszłości, jeśli Table1 kiedykolwiek zmieni się bez zmiany Table2 w synchronizacji (spalił mnie wcześniej). To rozwiązanie może być idealne dla Twojego przypadku, pamiętaj tylko o tych kwestiach.
Michael Haren
11
Możesz użyć SET IDENTITY_INSERT < table > ON(i SET IDENTITY_INSERT < table > OFF), aby tymczasowo wyłączyć kolumnę tożsamości w tabeli, do której próbujesz wstawić. Pracowałem dla mnie, próbując przywrócić kilka brakujących rekordów w środku zbioru danych.
nickb,
1
co się stanie, jeśli klucz podstawowy w tabeli 1 istnieje w tabeli 2 jako klucz obcy? Mam to samo i nie wiem, co robić .. w tabeli2 id klucz obcy AS "Technology_idTechnology", aw tabeli 1 jest tam jako "idTechnology" Chcę skopiować wszystkie wpisy z tabeli1 do table2, gdy idTechnology pasuje w obu tabelach ..
ZelelB
71

Alternatywna składnia:

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

Zapytanie wybierające może (oczywiście) zawierać wyrażenia, opisy przypadków, stałe / literały itp.

Michael Haren
źródło
2
Jest to świetne, gdy tabele nieznacznie się różnią. Mam kilka dodatkowych kolumn w mojej drugiej tabeli i zaakceptowana odpowiedź nie działa z MSSQL, ponieważ muszą być identyczne.
Tony M
39

Odpowiedź Jarretta tworzy nową tabelę.

Odpowiedź Scotta wstawia do istniejącej tabeli o tej samej strukturze.

Możesz również wstawić do tabeli o innej strukturze:

INSERT Table2
(columnX, columnY)
SELECT column1, column2 FROM Table1
WHERE [Conditions]
ScottStonehouse
źródło
6
@ScottStonehouse: jeśli zbierzesz wszystkie inne odpowiedzi do tej odpowiedzi, tak jak zrobiłeś, ale z kodem (czyniąc go wszechstronnym), zdecydowanie stałbyś się najlepszą odpowiedzią.
Michael Haren
6
INSERT INTO DestTable
SELECT * FROM SourceTable
WHERE ... 

działa w SQL Server

Kaniu
źródło
2
Działa to tylko wtedy, gdy DestTable nie istnieje. Jeśli przed tym zapytaniem zostanie utworzona tabela destrukcyjna, pojawi się błąd.
Web-Developer
2
W rzeczywistości kończy się niepowodzeniem, jeśli tabela docelowa nie istnieje. Może powodować błędy, jeśli istniejąca tabela DestTable nie jest pusta.
Kaniu,
5
SELECT * INTO < new_table > FROM < existing_table > WHERE < clause >
Jarrett Meyer
źródło
1
Czy istnieje sposób, aby to zrobić, jeśli te dwie tabele znajdują się w bazach danych diff w sql-server.
Naresh
9
Pewnie! Wystarczy w pełni zakwalifikować bazę danych. [nazwa serwera]. [schemat]. [tabela]. Na przykładSELECT * INTO [SQLTEST].[dbo].[EMPLOYEES] FROM [SQLPROD].[dbo].[EMPLOYEES]
Jarrett Meyer
4
Tworzy to nową tabelę, o którą nie prosi PO.
Conrad