Published on

August 11, 2011

Встроенное решение для получения значения идентификатора в SQL Server Integration Services

Когда речь идет о получении значения идентификатора для вставок в 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, следите за нашим следующим сообщением, где мы рассмотрим возможные решения.

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

Спасибо за чтение! Если у вас есть вопросы или предложения, пожалуйста, оставьте комментарий ниже.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.