SSIS派生列主键创建

时间:2018-02-12 20:06:20

标签: sql sql-server ssis etl identity

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

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

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

我不能使用CDC,因为它没有在标准版本的SQL服务器中支持。这是我的派生列任务现在的样子。我想知道我可以使用什么样的表达式来获得Tx_ID

的唯一主键值

enter image description here

1 个答案:

答案 0 :(得分:1)

第一种方法 - 添加标识列

这是最简单和推荐的方法,如果不需要在包中使用标识值,只需将Identity列添加到目标表

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

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

  1. DataFlow Task之前添加从此表中返回Execute SQL Task的{​​{1}}

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

  3. 将结果存储在变量(ex @[User::MaxID]
  4. 在DataFlow任务添加脚本组件中,将Single Row标记为@[User::MaxID]变量
  5. 添加ReadOnly 类型的输出列(例如:DT_I4
  6. 在脚本编辑器中使用以下代码(我使用的是Visual Basic语言)

    NewTxID
  7. 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 OLEDB Destination列映射到目标标识列

  8. <强>参考