如何使用我在后续任务中添加的记录的自动生成 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) 使用脚本组件生成标识值
在 DataFlow Task
之前添加一个 Execute SQL Task
即 return 来自此 table
的 MAX(ID)
SELECT MAX(ID) FROM MY_TABLE
使用 Single Row
ResultSet
[=69 将结果存储在变量 (例如 @[User::MaxID]
) 中=]
- 在 DataFlow 任务中添加脚本组件,将
@[User::MaxID]
标记为 ReadOnly
变量
- 添加
DT_I4
类型的输出列(例如:NewID
)
在脚本编辑器中使用以下代码(我使用的是 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
在OLEDB Destination
中勾选Keep identity
选项,并将NewID
列映射到目标标识列
然后您可以在将数据导入到 OLEDB 目标之前使用 NewID
列,因为在此解决方法中预测了标识值。 (如果需要并行执行另一个操作,可以添加Multicast组件复制数据流)
参考资料
- How to access ssis package variables inside script component
- Using Variables in the Script Component
- Map Result Sets to Variables in an Execute SQL Task
- SSIS Basics: Using the Execute SQL Task to Generate Result Sets
(2) 使用分段 table
- 使用标识列
创建暂存table
- 将数据插入暂存区 table
- 在数据流任务
中使用分段table
我最终使用了此处描述的方法:
在我的例子中,它看起来有点像这样:
INSERT INTO dbo.Benefit
(PeriodId,
BenefitCode,
...)
VALUES (
?,
?,
...);
SELECT ? = SCOPE_IDENTITY()
我目前正在使用 OLE DB Destination
添加一些记录到 table。每条记录都有一个自动生成的 Id
字段。
我想将这个生成的 Id
字段用作某些子记录中的外键。
我以为我可以将数据流从一个 OLE DB Destination
组件传输到另一个组件,但这不受支持。
我还以为这是一个常见问题 - 其他人是如何解决的?
解决方法
(1) 使用脚本组件生成标识值
在
的DataFlow Task
之前添加一个Execute SQL Task
即 return 来自此 tableMAX(ID)
SELECT MAX(ID) FROM MY_TABLE
使用
[=69 将结果存储在变量 (例如Single Row
ResultSet@[User::MaxID]
) 中=]- 在 DataFlow 任务中添加脚本组件,将
@[User::MaxID]
标记为ReadOnly
变量 - 添加
DT_I4
类型的输出列(例如:NewID
) 在脚本编辑器中使用以下代码(我使用的是 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
在
OLEDB Destination
中勾选Keep identity
选项,并将NewID
列映射到目标标识列
然后您可以在将数据导入到 OLEDB 目标之前使用 NewID
列,因为在此解决方法中预测了标识值。 (如果需要并行执行另一个操作,可以添加Multicast组件复制数据流)
参考资料
- How to access ssis package variables inside script component
- Using Variables in the Script Component
- Map Result Sets to Variables in an Execute SQL Task
- SSIS Basics: Using the Execute SQL Task to Generate Result Sets
(2) 使用分段 table
- 使用标识列 创建暂存table
- 将数据插入暂存区 table
- 在数据流任务 中使用分段table
我最终使用了此处描述的方法:
在我的例子中,它看起来有点像这样:
INSERT INTO dbo.Benefit
(PeriodId,
BenefitCode,
...)
VALUES (
?,
?,
...);
SELECT ? = SCOPE_IDENTITY()