2

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

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

我会认为这是一个常见问题 - 其他人如何解决它?

4

2 回答 2

3

解决方法

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

  1. DataFlow Task添加从该表Execute SQL Task返回的MAX(ID)

    SELECT MAX(ID) FROM MY_TABLE
    
  2. 使用ResultSet将结果存储在变量(ex @[User::MaxID])中Single Row

  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列映射到目标标识列

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

参考


(2) 使用暂存表

  1. 创建带有标识列的临时表
  2. 将数据插入临时表
  3. 在数据流任务中使用暂存表
于 2018-01-19T07:56:42.587 回答
1

我最终使用了这里描述的方法:

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

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

SELECT ? = SCOPE_IDENTITY()
于 2018-01-29T23:29:27.150 回答