Перемещение и копирование данных вокруг таблиц

  • Михаил
  • 12 мин. на прочтение
  • 127
  • 20 Jun 2022
  • 20 Jun 2022

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

Этот код выбирает данные из таблицы и отображает их в инструменте запроса (обычно SSMS)

SELECT Column1, Column2, Column3 FROM MySourceTable;

Этот код вставляет эти данные в таблицу:

INSERT INTO MyTargetTable (Column1, Column2, Column3)
SELECT Column1, Column2, Column3 FROM MySourceTable;

Копирование данных в таблицу, создание этой таблицы на лету

Этот код выбирает данные из таблицы:

SELECT Column1, Column2, Column3 FROM MySourceTable;

Этот код создает новую таблицу MyNewTable и помещает в нее эти данные

SELECT Column1, Column2, Column3 
INTO MyNewTable
FROM MySourceTable;

Перемещение данных в таблицу (при использовании метода уникальных ключей)

Чтобы перенести данные, вы сначала вставляете их в цель, а затем удаляете все, что вы вставили из исходной таблицы. Это не нормальная операция SQL, но она может быть просветляющей

Что вы вставляли? Обычно в базах данных необходимо иметь один или несколько столбцов, которые можно использовать для однозначной идентификации строк, поэтому мы будем предполагать это и использовать его.

Этот оператор выбирает некоторые строки

SELECT Key1, Key2, Column3, Column4 FROM MyTable;

Сначала мы вставляем их в нашу целевую таблицу:

INSERT INTO TargetTable (Key1, Key2, Column3, Column4)
SELECT Key1, Key2, Column3, Column4 FROM MyTable;

Теперь, предполагая, что записи в обеих таблицах уникальны в Key1 , Key2 , мы можем использовать это для поиска и удаления данных из исходной таблицы

DELETE MyTable
WHERE EXISTS (
    SELECT * FROM TargetTable 
    WHERE TargetTable.Key1 = SourceTable.Key1
    AND TargetTable.Key2 = SourceTable.Key2
);

Это будет работать только в том Key1 , если Key1 , Key2 уникальны в обеих таблицах

Наконец, мы не хотим, чтобы работа была выполнена наполовину. Если мы завершим это в транзакции, то либо все данные будут перемещены, либо ничего не произойдет. Это гарантирует, что мы не вставляем данные, а затем не можем удалить данные из источника.

BEGIN TRAN;

INSERT INTO TargetTable (Key1, Key2, Column3, Column4)
SELECT Key1, Key2, Column3, Column4 FROM MyTable;


DELETE MyTable
WHERE EXISTS (
    SELECT * FROM TargetTable 
    WHERE TargetTable.Key1 = SourceTable.Key1
    AND TargetTable.Key2 = SourceTable.Key2
);

COMMIT TRAN;