Как я могу использовать автоматически сгенерированный идентификатор записи, которую я добавил в последующем задании?

В настоящее время я добавляю некоторые записи в таблицу, используя OLE DB Destination, Каждая запись имеет автоматически сгенерированный Id поле. Я хочу использовать это сгенерированное Id поле в качестве внешнего ключа в некоторых дочерних записях.

Я думал, что смогу к линии потока данных от одного OLE DB Destination компонент к другому, но это не поддерживается.

Я бы подумал, что это общая проблема - как другие решают ее?

2 ответа

Решение

Я закончил тем, что использовал подход, описанный здесь:

В моем случае это выглядело примерно так:

INSERT INTO dbo.Benefit
 (PeriodId,
  BenefitCode,
  ...)
VALUES (
  ?,
  ?,
  ...);

SELECT ? = SCOPE_IDENTITY()

обходные

(1) Создание значений идентичности с использованием компонента Script

  1. До DataFlow Task добавить Execute SQL Task что вернуть MAX(ID) из этой таблицы

    SELECT MAX(ID) FROM MY_TABLE
    
  2. Сохраните результат в переменной (например, @[User::MaxID] ) используя Single Row ResultSet

  3. В задаче DataFlow Добавить компонент сценария отметьте @[User::MaxID] как ReadOnly переменная
  4. Добавить столбец вывода типа DT_I4 (например: NewID )
  5. В редакторе скриптов используйте следующий код (я использовал язык Visual Basic)

    Imports System  
    Imports System.Data  
    Imports System.Math  
    Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper  
    Imports Microsoft.SqlServer.Dts.Runtime.Wrapper  
    
    <Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute> _  
    <CLSCompliant(False)> _  
    Public Class ScriptMain  
        Inherits UserComponent 
    
        Private CurrentID as Integer  = 0
    
        Public Overrides Sub PreExecute()  
            MyBase.PreExecute()  
    
            CurrentID = Me.Variables.NewID
    
        End Sub  
    
        Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)  
    
            CurrentID += 1
    
            Row.NewID = CurrentID
    
    
        End Sub 
    
    End Class
    
  6. в OLEDB Destination проверить Keep identity вариант, и Карта NewID столбец к столбцу идентификатора назначения

Тогда вы можете использовать NewID столбец перед тем, как эти данные импортируются в пункт назначения OLEDB, поскольку в этом обходном пути прогнозируются значения идентификаторов. (Вы можете добавить компонент Multicast для дублирования потока данных, если вам нужно выполнить другую операцию параллельно)

Рекомендации


(2) Используйте промежуточный стол

  1. Создайте промежуточную таблицу со столбцом идентификаторов
  2. Вставить данные в промежуточную таблицу
  3. Используйте промежуточную таблицу в задаче потока данных
Другие вопросы по тегам