我目前正在使用OLE DB Destination
. 每条记录都有一个自动生成的Id
字段。我想将此生成Id
的字段用作某些子记录中的外键。
我以为我可以将数据流线从一个OLE DB Destination
组件传输到另一个组件,但这不受支持。
我会认为这是一个常见问题 - 其他人如何解决它?
我目前正在使用OLE DB Destination
. 每条记录都有一个自动生成的Id
字段。我想将此生成Id
的字段用作某些子记录中的外键。
我以为我可以将数据流线从一个OLE DB Destination
组件传输到另一个组件,但这不受支持。
我会认为这是一个常见问题 - 其他人如何解决它?
在DataFlow Task
添加从该表Execute SQL Task
返回的MAX(ID)
SELECT MAX(ID) FROM MY_TABLE
使用ResultSet将结果存储在变量(ex @[User::MaxID]
)中Single Row
@[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
列映射到目标标识列
然后,您可以NewID
在将该数据导入 OLEDB 目标之前使用该列,因为在此解决方法中会预测标识值。(如果需要并行执行另一个操作,可以添加组播组件来复制数据流)
参考
我最终使用了这里描述的方法:
就我而言,它看起来有点像这样:
INSERT INTO dbo.Benefit
(PeriodId,
BenefitCode,
...)
VALUES (
?,
?,
...);
SELECT ? = SCOPE_IDENTITY()