ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Преобразование результатов SELECT в INSERT в SQL Server

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

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

Для формирования запроса insert на основании данных, полученных при помощи select, следует применить такой синтаксис:

SQL
Скопировать код
INSERT INTO Назначение (Столбец1, Столбец2, ...)
SELECT Столбец1, Столбец2, ... FROM Источник WHERE УсловиеФильтрации;

Таким образом, данные из исходной таблицы передаются в соответствующие столбцы целевой таблицы. Использование условия WHERE позволяет отфильтровать данные по определенным критериям.

Пример использования:

SQL
Скопировать код
INSERT INTO НовыйПерсонал (ID, Имя)
SELECT ИдентификаторСотрудника, ПолноеИмя FROM Сотрудники WHERE Статус = 1;

Такой подход позволяет эффективно перенести данные о работающих сотрудниках в таблицу НовыйПерсонал, синхронизируя выбранные поля с заранее определенной структурой таблицы.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

SSMS и инструменты автоматизации

SQL Server Management Studio (SSMS) и приложение SSMS Toolpack предлагают возможности автоматизации преобразования результатов запроса SELECT в INSERT. Это особенно используется при работе с большими объемами данных или в ситуациях, когда данные разнесены по разным базам данных.

Ручное создание скриптов insert

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

SQL
Скопировать код
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += 
  'INSERT INTO МояЦелеваяТаблица (Столбец1, Столбец2) VALUES (' +
   QUOTENAME(Кол1, '''') + ', ' + 
   QUOTENAME(Кол2, '''') + ');' + CHAR(13)
FROM ИсходнаяТаблица
WHERE УсловиеФильтрации;

EXEC sp_executesql @sql;

Функция QUOTENAME() облегчает работу с кавычками, а ISNULL содействует в обработке значений NULL.

Динамическое создание скриптов insert

Если структура таблиц часто меняется, то динамическое создание скриптов insert становится очень удобным. Представления каталогов SQL Server sys.all_columns и динамический SQL совместно выполняют работу незаменимых помощников:

SQL
Скопировать код
DECLARE @table NVARCHAR(128) = N'ЦелеваяТаблица', @sql NVARCHAR(MAX), @cols NVARCHAR(MAX);

SELECT @cols = STUFF((
    SELECT ', ' + QUOTENAME(name) 
    FROM sys.all_columns 
    WHERE object_id = OBJECT_ID(@table) 
    FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 2, '');

SET @sql = 'INSERT INTO ' + @table + '(' + @cols + ') SELECT ' + @cols + ' FROM ...';
-- В указанном выше запросе необходимо вставить соответствующий контент

EXECUTE(@sql);

Функции STUFF и FOR XML PATH помогают автоматически подготовить список столбцов, который затем применяется в запросе INSERT.

Оптимизация с помощью процедур

Составление хранимой процедуры позволяет автоматизировать процесс составления скриптов INSERT, освобождая время для приоритетных задач:

SQL
Скопировать код
CREATE PROCEDURE GenerateInsertScript 
  @Source NVARCHAR(128),
  @Target NVARCHAR(128),
  @Filter NVARCHAR(MAX) = NULL
AS
BEGIN
  DECLARE @sql NVARCHAR(MAX);
  -- Здесь может быть логика динамического создания скриптов
  SET @sql = --...;
  EXECUTE(@sql);
END
GO

Параметры, такие как @Source, @Target и @Filter, дают возможность конфигурировать запросы в соответствии с потребностями данных.

Замена и очистка

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