Как скопировать строку из одной таблицы SQL Server в другую

93

У меня две одинаковые таблицы, и мне нужно скопировать строки из таблицы в другую. Как лучше всего это сделать? (Мне нужно программно скопировать всего несколько строк, мне не нужно использовать утилиту массового копирования).

рп.
источник

Ответы:

120

Пока нет столбцов идентификации, вы можете просто

INSERT INTO TableNew
SELECT * FROM TableOld
WHERE [Conditions]
Скотт Николс
источник
23
Будьте осторожны с этим синтаксисом, так как он не будет работать, если в Table2 есть столбец идентификаторов, и он сломается в будущем, если Table1 когда-либо изменится без синхронизации Table2 (раньше меня сожгли). Это решение может быть идеальным для вашего случая, просто помните об этих соображениях.
Майкл Харен,
11
Вы можете использовать SET IDENTITY_INSERT < table > ONSET IDENTITY_INSERT < table > OFF), чтобы временно отключить столбец идентификаторов в таблице, в которую вы пытаетесь вставить. У меня сработало, пытаясь восстановить несколько недостающих записей в середине набора данных.
nickb
1
что, если первичный ключ в таблице 1 существует в таблице 2 как внешний ключ? У меня то же самое, и я не знаю, что делать .. в table2 id внешний ключ AS "Technology_idTechnology", а в таблице 1 он указан как "idTechnology". Я хочу скопировать все записи из table1 в table2, когда idTechnology совпадает в обеих таблицах ..
ZelelB
71

Альтернативный синтаксис:

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

Запрос на выбор может (конечно) включать выражения, операторы case, константы / литералы и т. Д.

Майкл Харен
источник
2
Это здорово, когда таблицы немного отличаются. У меня есть несколько дополнительных столбцов во второй таблице, и принятый ответ не работает с MSSQL, поскольку они должны быть идентичными.
Tony M
39

Ответ Джарретта создает новую таблицу.

Ответ Скотта вставляется в существующую таблицу с той же структурой.

Вы также можете вставить в таблицу с другой структурой:

INSERT Table2
(columnX, columnY)
SELECT column1, column2 FROM Table1
WHERE [Conditions]
ScottStonehouse
источник
6
@ScottStonehouse: если вы соберете все остальные ответы в этот ответ, как вы это сделали, но с кодом (сделав его всеобъемлющим), вы определенно станете лучшим ответом.
Майкл Харен,
6
INSERT INTO DestTable
SELECT * FROM SourceTable
WHERE ... 

работает в SQL Server

Kaniu
источник
2
Это работает, только когда DestTable не существует. Вы получите сообщение об ошибке, если перед этим запросом будет создана таблица DestTable.
Веб-разработчик,
2
На самом деле это не удается, если целевая таблица не существует. Это может вызвать ошибки, если существующая таблица DestTable не пуста.
Kaniu
5
SELECT * INTO < new_table > FROM < existing_table > WHERE < clause >
Джарретт Мейер
источник
1
Есть ли способ сделать это, если эти две таблицы находятся в базах данных diff на sql-server.
Naresh
9
Конечно! Просто полностью уточните базу данных. [имя сервера]. [схема]. [таблица]. НапримерSELECT * INTO [SQLTEST].[dbo].[EMPLOYEES] FROM [SQLPROD].[dbo].[EMPLOYEES]
Джаррет Мейер
4
Это создает новую таблицу, а это не то, о чем просит OP.
Конрад,