我目前正在使用以下命令向表中添加一些记录OLE DB Destination
。每条记录都有一个自动生成的Id
场地。
我想使用这个生成的Id
字段作为某些子记录中的外键。
我以为我能够从一个数据流线OLE DB Destination
组件到另一个组件,但这不受支持。
我本以为这是一个常见问题 - 其他人如何解决它?
解决方法
(1) 使用Script组件生成标识值
-
Before DataFlow Task
add an Execute SQL Task
返回MAX(ID)
从这个表
SELECT MAX(ID) FROM MY_TABLE
将结果存储在变量中(ex @[User::MaxID]
)用一个Single Row
结果集
- 在 DataFlow 任务中添加脚本组件,标记
@[User::MaxID]
as ReadOnly
多变的
- 添加类型的输出列
DT_I4
(ex: 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
In the OLEDB Destination
检查Keep identity
选项,并映射NewID
列到目标标识列
然后您可以使用NewID
列之前将数据导入到 OLEDB 目标,因为在此解决方法中预测了标识值。(如果需要并行执行另一个操作,可以添加多播组件来复制数据流)
参考
- 如何访问脚本组件内的 ssis 包变量 https://stackoverflow.com/questions/13450289/how-to-access-ssis-package-variables-inside-script-component
- 在脚本组件中使用变量 https://learn.microsoft.com/en-us/sql/integration-services/extending-packages-scripting/data-flow-script-component/using-variables-in-the-script-component
- 将结果集映射到执行 SQL 任务中的变量 https://technet.microsoft.com/en-us/library/ms141689(v=sql.110).aspx
- SSIS 基础知识:使用执行 SQL 任务生成结果集 https://www.red-gate.com/simple-talk/sql/ssis/ssis-basics-using-the-execute-sql-task-to-generate-result-sets/
(2) 使用暂存表
- 创建带有标识列的临时表
- 将数据插入临时表
- 在数据流任务中使用临时表
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)