Когда речь идет о получении значения идентификатора для вставок в SQL Server Integration Services (SSIS), можно использовать различные подходы. В предыдущей статье мы обсудили одно решение с использованием скриптов. Однако в этой статье мы рассмотрим встроенное решение с использованием обычных SSIS задач и компонентов.
Любовь/ненависть к компоненту OLE DB Command
Компонент OLE DB Command в SSIS часто не нравится из-за проблем с производительностью. Однако он может быть полезным инструментом, когда другое решение не работает. В этом случае наш старый враг снова придет на помощь.
Но прежде чем мы приступим к решению, давайте разберемся в проблеме. Предположим, у нас есть таблица с двумя столбцами: ID (автоматически генерируемый столбец идентификатора) и TEXTVALUE. Нашей целью является получение значения идентификатора после вставки новой строки в эту таблицу.
Ключи к решению
Решение включает использование хранимой процедуры с выходным параметром и компонента OLE DB Command. Давайте посмотрим на определение хранимой процедуры для нашего примера:
CREATE PROCEDURE InsertData
@textvalue AS CHAR(10),
@id AS INT OUTPUT
AS
BEGIN
INSERT INTO IdentityTable (textvalue)
VALUES (@textvalue)
SET @id = SCOPE_IDENTITY()
END
Как видите, хранимая процедура принимает TEXTVALUE в качестве входного параметра и ID в качестве выходного параметра. После вставки данных в таблицу она устанавливает переменную @id равной значению SCOPE_IDENTITY(), которое представляет значение идентификатора последней вставленной строки.
Реализация решения в SSIS
В SSIS мы можем использовать компонент Derived Column для создания столбца ID со значением NULL(DT_I4). Этот столбец будет служить заполнителем для нашего значения идентификатора. Затем мы можем использовать компонент OLE DB Command для выполнения хранимой процедуры и получения значения идентификатора.
Вот пример оператора для компонента OLE DB Command:
EXEC InsertData ?, ? OUTPUT
Убедитесь, что столбцы правильно сопоставлены в компоненте.
Общая картина
Хотя это решение работает, у него есть некоторые недостатки. Во-первых, оно может работать медленно, особенно если пакет выполняется на другом сервере, чем база данных, где находится хранимая процедура. Компонент OLE DB Command делает обращение к базе данных для каждой строки, что может быть дорогостоящим.
Кроме того, это решение включает процесс построчной обработки (RBAR), который работает медленнее по сравнению с множественными процессами, для которых лучше подходит SQL Server. Во время этой части потока данных не полностью используются среда выполнения Integration Services и процессы SQL Server.
Несмотря на эти ограничения, встроенное решение может быть полезным в определенных сценариях. Если вас интересует устранение недостатка RBAR, следите за нашим следующим сообщением, где мы рассмотрим возможные решения.
Не стесняйтесь проверить пример пакета, предоставленного в этой статье, чтобы увидеть решение в действии. Он создает базу данных, пример таблицы, вставляет строку, получает значение идентификатора и затем удаляет базу данных.
Спасибо за чтение! Если у вас есть вопросы или предложения, пожалуйста, оставьте комментарий ниже.