如何使用我在后续任务中添加的记录的自动生成 ID?

How can I use the auto-generated Id of a record I added in a subsequent task?

我目前正在使用 OLE DB Destination 添加一些记录到 table。每条记录都有一个自动生成的 Id 字段。 我想将这个生成的 Id 字段用作某些子记录中的外键。

我以为我可以将数据流从一个 OLE DB Destination 组件传输到另一个组件,但这不受支持。

我还以为这是一个常见问题 - 其他人是如何解决的?

解决方法

(1) 使用脚本组件生成标识值

  1. DataFlow Task 之前添加一个 Execute SQL Task 即 return 来自此 table

    MAX(ID)
    SELECT MAX(ID) FROM MY_TABLE
    
  2. 使用 Single Row ResultSet

    [=69 将结果存储在变量 (例如 @[User::MaxID] 中=]
  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列映射到目标标识列

然后您可以在将数据导入到 OLEDB 目标之前使用 NewID 列,因为在此解决方法中预测了标识值。 (如果需要并行执行另一个操作,可以添加Multicast组件复制数据流)

参考资料


(2) 使用分段 table

  1. 使用标识列
  2. 创建暂存table
  3. 将数据插入暂存区 table
  4. 在数据流任务
  5. 中使用分段table

我最终使用了此处描述的方法:

在我的例子中,它看起来有点像这样:

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

SELECT ? = SCOPE_IDENTITY()