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

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для копирования данных применяем команду INSERT INTO целевая_таблица с подзапросом SELECT из источник_таблицы:

SQL
Скопировать код
INSERT INTO целевая_таблица SELECT * FROM источник_таблицы;

Если необходимо выбрать конкретные столбцы, выполните следующую команду:

SQL
Скопировать код
INSERT INTO целевая_таблица (столбец1, столбец2) SELECT столбец1, столбец2 FROM источник_таблицы;

Помните о совместимости столбцов для корректного копирования данных.

Кинга Идем в IT: пошаговый план для смены профессии

Подробнее о процессе

Работа с разными схемами

При работе с таблицами разных схем важно явно указывать столбцы:

SQL
Скопировать код
INSERT INTO целевая_таблица (целевойСтолбец1, целевойСтолбец2) SELECT исходныйСтолбец1, исходныйСтолбец2 FROM источник_таблицы;

Это позволяет контролировать, куда точно будут помещены данные.

Отсутствие ошибок схемы

Обратите внимание: INSERT INTO позволяет добавить данные в уже существующую таблицу, в отличие от SELECT INTO, которая создает новую:

SQL
Скопировать код
SELECT * INTO новая_таблица FROM источник_таблицы; -- Берегитесь данной ловушки!

Поэтому заранее создавайте новые таблицы, чтобы избежать неожиданностей на продакшене.

Повышение эффективности с 'INSERT SELECT'

При массовом переносе данных предпочтение отдается INSERT SELECT, так как это быстро и надежно. Для больших объемов рассмотрите методы массового импорта:

SQL
Скопировать код
BULK INSERT целевая_таблица FROM 'файл_данных_источника' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'); -- Это настоящий "тяжеловес", поэтому действуйте осторожно!

или

SQL
Скопировать код
OPENROWSET(BULK 'файл_данных_источника', FORMATFILE = 'путь_к_файлу_формата') AS источник_таблицы; -- Это заметно улучшает производительность SQL.

Контроль соответствия данных

Используйте явное указание столбцов вместо *, чтобы предотвратить ошибки в соответствии данных.

Практические примеры применения

Условное копирование

При копировании по условию используйте WHERE:

SQL
Скопировать код
INSERT INTO целевая_таблица (столбец1, столбец2) SELECT столбец1, столбец2 FROM источник_таблицы WHERE столбец3 = 'условие'; -- Где есть желание, там найдется решение!

Перенос подмножеств

Используйте JOIN или подзапросы для переноса отдельных данных:

SQL
Скопировать код
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:

SQL
Скопировать код
INSERT INTO целевая_таблица (ID, DataPoint)
SELECT ID, DataPoint FROM источник_таблицы
WHERE NOT EXISTS (SELECT 1 FROM целевая_таблица WHERE целевая_таблица.ID = источник_таблицы.ID); -- Дубликаты в базе данных – это всегда плохо.

или

SQL
Скопировать код
INSERT INTO целевая_таблица
SELECT ID, DataPoint FROM источник_таблицы
EXCEPT SELECT ID, DataPoint FROM целевая_таблица; -- Дублирующие строки не пройдут!

Визуализация

Воображайте процесс переноса данных как миграцию "птиц данных" из одной таблицы в другую:

Markdown
Скопировать код
"Исходная таблица" 🕊️🌳 – - – - – > "Целевая таблица" 🏞️🌲

Каждая "птица данных", то есть строка, назодит новый дом в целевой таблице с помощью INSERT INTO...SELECT:

SQL
Скопировать код
INSERT INTO ЦелеваяТаблица (Столбец1, Столбец2, ...)
SELECT Столбец1, Столбец2, ...
FROM ИсходнаяТаблица
WHERE условие;

В упрощенном виде это выглядит так:

Markdown
Скопировать код
🕊️🌳 => 🕊️🌲
🕊️🌳 => 🕊️🌲
🕊️🌳 => 🕊️🌲
# Ни одна строка не будет без внимания! 🐥

Менее распространенные случаи

Перенос данных между базами данных

Для копирования данных в другую базу данных добавьте полный путь к таблице:

SQL
Скопировать код
INSERT INTO БазаДанных2.dbo.целевая_таблица (столбец1, столбец2)
SELECT столбец1, столбец2 FROM БазаДанных1.dbo.источник_таблицы;

Трансформация данных во время переноса

Вы можете трансформировать данные во время переноса с помощью функций трансформации:

SQL
Скопировать код
INSERT INTO целевая_таблица (скорректированная_колонка)
SELECT CONVERT(VARCHAR, CAST(исходная_колонка AS DATE), 101) FROM источник_таблицы;

Обеспечение сохранности работы во время переноса

Для обеспечения безопасности выполните операцию внутри транзакционной сессии:

SQL
Скопировать код
BEGIN TRANSACTION;
INSERT INTO целевая_таблица SELECT * FROM источник_таблицы;
-- В случае ошибки мы можем откатить изменения, господа!
COMMIT TRANSACTION;

Избегайте этих ошибок

Несоответствие типов данных

Тщательно сравнивайте типы данных, чтобы избежать ошибок при конвертации.

Нужен доступ

Перед переносом данных проверьте свои разрешения на чтение и запись в таблицах.

Губители производительности

При копировании больших объемов данных избегайте блокировок и долгих транзакций, следите за производительностью и используйте индексы или пакетные операции.

Полезные материалы

  1. Инструкция SQL INSERT INTO SELECT (W3Schools) — руководство по использованию оператора INSERT INTO SELECT в SQL.
  2. Запросы NHibernate возвращают несколько копий целевых объектов (Stack Overflow) — обсуждение вопросов дублирования данных в SQL-запросах.
  3. Используйте BULK INSERT или OPENROWSET(BULK...) для импорта данных в SQL Server (Microsoft Learn) — официальная документация по методам массового импорта данных в SQL Server.
  4. Как вставить значения в таблицу из запроса SELECT в SQL (GeeksforGeeks) — пошаговое руководство по копированию данных между таблицами в SQL.