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)
第二种方法 - 使用脚本组件
在 DataFlow Task
之前添加一个 Execute SQL Task
即 return 来自此 table
的 MAX(ID)
SELECT MAX(Tx_ID) FROM [Archival Table]
使用 Single Row
ResultSet
[=60 将结果存储在变量 (例如 @[User::MaxID]
) 中=]
- 在 DataFlow 任务中添加脚本组件,将
@[User::MaxID]
标记为 ReadOnly
变量
- 添加
DT_I4
类型的输出列(例如:NewTxID
)
在脚本编辑器中使用以下代码(我使用的是 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
在OLEDB Destination
中将NewTxID
列映射到目标标识列
参考资料
- How to access ssis package variables inside script component
- Using Variables in the Script Component
- Map Result Sets to Variables in an Execute SQL Task
- SSIS Basics: Using the Execute SQL Task to Generate Result Sets
我正在尝试为我在 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)
第二种方法 - 使用脚本组件
在
的DataFlow Task
之前添加一个Execute SQL Task
即 return 来自此 tableMAX(ID)
SELECT MAX(Tx_ID) FROM [Archival Table]
使用
[=60 将结果存储在变量 (例如Single Row
ResultSet@[User::MaxID]
) 中=]- 在 DataFlow 任务中添加脚本组件,将
@[User::MaxID]
标记为ReadOnly
变量 - 添加
DT_I4
类型的输出列(例如:NewTxID
) 在脚本编辑器中使用以下代码(我使用的是 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
在
OLEDB Destination
中将NewTxID
列映射到目标标识列
参考资料
- How to access ssis package variables inside script component
- Using Variables in the Script Component
- Map Result Sets to Variables in an Execute SQL Task
- SSIS Basics: Using the Execute SQL Task to Generate Result Sets