Преобразование результатов SELECT в INSERT в SQL Server
Быстрый ответ
Для формирования запроса insert на основании данных, полученных при помощи select, следует применить такой синтаксис:
INSERT INTO Назначение (Столбец1, Столбец2, ...)
SELECT Столбец1, Столбец2, ... FROM Источник WHERE УсловиеФильтрации;
Таким образом, данные из исходной таблицы передаются в соответствующие столбцы целевой таблицы. Использование условия WHERE
позволяет отфильтровать данные по определенным критериям.
Пример использования:
INSERT INTO НовыйПерсонал (ID, Имя)
SELECT ИдентификаторСотрудника, ПолноеИмя FROM Сотрудники WHERE Статус = 1;
Такой подход позволяет эффективно перенести данные о работающих сотрудниках в таблицу НовыйПерсонал
, синхронизируя выбранные поля с заранее определенной структурой таблицы.
SSMS и инструменты автоматизации
SQL Server Management Studio (SSMS) и приложение SSMS Toolpack предлагают возможности автоматизации преобразования результатов запроса SELECT
в INSERT
. Это особенно используется при работе с большими объемами данных или в ситуациях, когда данные разнесены по разным базам данных.
Ручное создание скриптов insert
Если требуется быстрый и простой метод, можно использовать следующую конструкцию для ручного создания скриптов INSERT INTO
, объединяя результаты запроса SELECT
:
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 совместно выполняют работу незаменимых помощников:
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
, освобождая время для приоритетных задач:
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
, дают возможность конфигурировать запросы в соответствии с потребностями данных.
Замена и очистка
Важно произвести замену временных названий таблиц на целевые в сгенерированных скриптах, а также не забыть удалить временные таблицы после выполнения работы, чтобы обеспечить порядок и оптимальное функционирование базы данных.