Копирование данных из одной таблицы в другую в SQL Server
Быстрый ответ
Для копирования данных применяем команду INSERT INTO целевая_таблица
с подзапросом SELECT
из источник_таблицы
:
INSERT INTO целевая_таблица SELECT * FROM источник_таблицы;
Если необходимо выбрать конкретные столбцы, выполните следующую команду:
INSERT INTO целевая_таблица (столбец1, столбец2) SELECT столбец1, столбец2 FROM источник_таблицы;
Помните о совместимости столбцов для корректного копирования данных.
Подробнее о процессе
Работа с разными схемами
При работе с таблицами разных схем важно явно указывать столбцы:
INSERT INTO целевая_таблица (целевойСтолбец1, целевойСтолбец2) SELECT исходныйСтолбец1, исходныйСтолбец2 FROM источник_таблицы;
Это позволяет контролировать, куда точно будут помещены данные.
Отсутствие ошибок схемы
Обратите внимание: INSERT INTO
позволяет добавить данные в уже существующую таблицу, в отличие от SELECT INTO
, которая создает новую:
SELECT * INTO новая_таблица FROM источник_таблицы; -- Берегитесь данной ловушки!
Поэтому заранее создавайте новые таблицы, чтобы избежать неожиданностей на продакшене.
Повышение эффективности с 'INSERT SELECT'
При массовом переносе данных предпочтение отдается INSERT SELECT
, так как это быстро и надежно. Для больших объемов рассмотрите методы массового импорта:
BULK INSERT целевая_таблица FROM 'файл_данных_источника' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'); -- Это настоящий "тяжеловес", поэтому действуйте осторожно!
или
OPENROWSET(BULK 'файл_данных_источника', FORMATFILE = 'путь_к_файлу_формата') AS источник_таблицы; -- Это заметно улучшает производительность SQL.
Контроль соответствия данных
Используйте явное указание столбцов вместо *
, чтобы предотвратить ошибки в соответствии данных.
Практические примеры применения
Условное копирование
При копировании по условию используйте WHERE
:
INSERT INTO целевая_таблица (столбец1, столбец2) SELECT столбец1, столбец2 FROM источник_таблицы WHERE столбец3 = 'условие'; -- Где есть желание, там найдется решение!
Перенос подмножеств
Используйте JOIN
или подзапросы для переноса отдельных данных:
INSERT INTO целевая_таблица (ID, DataPoint)
SELECT s.ID, s.DataPoint
FROM источник_таблицы AS s
INNER JOIN другая_таблица AS a ON s.ID = a.ID
WHERE a.Condition = TRUE; -- Этот подход для истинных гуру SQL!
Борьба с дубликатами
Исключайте дубликаты с помощью NOT EXISTS
или EXCEPT
:
INSERT INTO целевая_таблица (ID, DataPoint)
SELECT ID, DataPoint FROM источник_таблицы
WHERE NOT EXISTS (SELECT 1 FROM целевая_таблица WHERE целевая_таблица.ID = источник_таблицы.ID); -- Дубликаты в базе данных – это всегда плохо.
или
INSERT INTO целевая_таблица
SELECT ID, DataPoint FROM источник_таблицы
EXCEPT SELECT ID, DataPoint FROM целевая_таблица; -- Дублирующие строки не пройдут!
Визуализация
Воображайте процесс переноса данных как миграцию "птиц данных" из одной таблицы в другую:
"Исходная таблица" 🕊️🌳 – - – - – > "Целевая таблица" 🏞️🌲
Каждая "птица данных", то есть строка, назодит новый дом в целевой таблице с помощью INSERT INTO...SELECT
:
INSERT INTO ЦелеваяТаблица (Столбец1, Столбец2, ...)
SELECT Столбец1, Столбец2, ...
FROM ИсходнаяТаблица
WHERE условие;
В упрощенном виде это выглядит так:
🕊️🌳 => 🕊️🌲
🕊️🌳 => 🕊️🌲
🕊️🌳 => 🕊️🌲
# Ни одна строка не будет без внимания! 🐥
Менее распространенные случаи
Перенос данных между базами данных
Для копирования данных в другую базу данных добавьте полный путь к таблице:
INSERT INTO БазаДанных2.dbo.целевая_таблица (столбец1, столбец2)
SELECT столбец1, столбец2 FROM БазаДанных1.dbo.источник_таблицы;
Трансформация данных во время переноса
Вы можете трансформировать данные во время переноса с помощью функций трансформации:
INSERT INTO целевая_таблица (скорректированная_колонка)
SELECT CONVERT(VARCHAR, CAST(исходная_колонка AS DATE), 101) FROM источник_таблицы;
Обеспечение сохранности работы во время переноса
Для обеспечения безопасности выполните операцию внутри транзакционной сессии:
BEGIN TRANSACTION;
INSERT INTO целевая_таблица SELECT * FROM источник_таблицы;
-- В случае ошибки мы можем откатить изменения, господа!
COMMIT TRANSACTION;
Избегайте этих ошибок
Несоответствие типов данных
Тщательно сравнивайте типы данных, чтобы избежать ошибок при конвертации.
Нужен доступ
Перед переносом данных проверьте свои разрешения на чтение и запись в таблицах.
Губители производительности
При копировании больших объемов данных избегайте блокировок и долгих транзакций, следите за производительностью и используйте индексы или пакетные операции.
Полезные материалы
- Инструкция SQL INSERT INTO SELECT (W3Schools) — руководство по использованию оператора INSERT INTO SELECT в SQL.
- Запросы NHibernate возвращают несколько копий целевых объектов (Stack Overflow) — обсуждение вопросов дублирования данных в SQL-запросах.
- Используйте BULK INSERT или OPENROWSET(BULK...) для импорта данных в SQL Server (Microsoft Learn) — официальная документация по методам массового импорта данных в SQL Server.
- Как вставить значения в таблицу из запроса SELECT в SQL (GeeksforGeeks) — пошаговое руководство по копированию данных между таблицами в SQL.