SSIS 派生列主键创建

SSIS Derived Column Primary Key Creation

我正在尝试为我在 SQL 服务器中构建的 table 创建存档 table。我想使用 SSIS 包记录对 table 的每个更改并将其添加到存档 table。如果成功,我应该能够查询存档并构建在特定日期范围内存在的 table,并且能够查询 table 以查看日期范围内的更改列表。在从我正在使用的数据源更新我的报告 table 的同一个 SSIS 包中,我有一个派生列任务,它将插入一个 BOOLEAN 值、一个交易日期,并且我想添加一个唯一的整数 ID对于每笔交易。没有一个明确的方法来做到这一点,我想知道是否有人可以告诉我?

作为参考,我的这个项目的模型是:

Source DATA --> SSIS --> Report Table --> Archival Table

我无法使用 CDC,因为 SQL 服务器的标准版本不支持它。这是我的派生列任务现在的样子。我想知道我可以使用哪种表达式来获取唯一的主键值作为 Tx_ID

第一种方法 - 添加标识列

这是最简单推荐的方法,如果不需要使用包内的identity值,只需在目标中添加一个Identity列即可table

ALTER TABLE [Archival Table]
ADD Tx_ID INT IDENTITY(1,1)

第二种方法 - 使用脚本组件

  1. DataFlow Task 之前添加一个 Execute SQL Task 即 return 来自此 table

    MAX(ID)
    SELECT MAX(Tx_ID) FROM [Archival Table]
    
  2. 使用 Single Row ResultSet

    [=60 将结果存储在变量 (例如 @[User::MaxID] 中=]
  3. 在 DataFlow 任务中添加脚本组件,将 @[User::MaxID] 标记为 ReadOnly 变量
  4. 添加 DT_I4 类型的输出列(例如:NewTxID
  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.MaxID
    
        End Sub  
    
        Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)  
    
            CurrentID += 1
    
            Row.NewTxID = CurrentID
    
    
        End Sub 
    
    End Class
    
  6. OLEDB Destination中将NewTxID列映射到目标标识列

参考资料