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

时间:2018-01-19 04:57:22

标签: sql-server ssis etl identity oledbdestination

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

我以为我能够从一个OLE DB Destination组件到另一个json_encode($response, JSON_FORCE_OBJECT); json_encode($response); 组件的数据流,但这不受支持。

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

2 个答案:

答案 0 :(得分:3)

的变通方法

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

  1. DataFlow Task之前添加从此表中返回Execute SQL Task的{​​{1}}

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

  3. 将结果存储在变量(ex @[User::MaxID]
  4. 在DataFlow任务添加脚本组件中,将Single Row标记为@[User::MaxID]变量
  5. 添加ReadOnly 类型的输出列(例如:DT_I4
  6. 在脚本编辑器中使用以下代码(我使用的是Visual Basic语言)

    NewID
  7. 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 中选中OLEDB Destination选项,并将Keep identity列映射到目标标识列

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

    <强>参考

    (2)使用临时表

    1. 使用标识列
    2. 创建临时表
    3. 将数据插入临时表
    4. 使用数据流任务
    5. 中的登台表

答案 1 :(得分:1)

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

就我而言,它看起来有点像这样:

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

SELECT ? = SCOPE_IDENTITY()