使用 SSIS 插入记录时添加增量编号
Add incremental number while inserting records using SSIS
我有一个 SSIS 包,其中有两条记录。我需要在 table 中插入带有额外列(比方说序列)的记录。如果有两条记录,Sequence 列的值应为 1(对于第一条记录)和 2(对于第二条记录)。同样,下一次,我得到三个记录,然后序列再次从 1,2 和 3 开始。
是否可以在不使用脚本或存储过程的情况下执行此操作?
截图:
您可以在数据库本身中实现这一点,而无需在 SSIS 包中添加逻辑。只需使用 IDENTITY 向目标 table 添加一个列,它就会自动递增。无需在 SSIS 中添加一些额外的逻辑
您可以通过更改 Table
添加 IDENTITY 列(如果 Table 上还没有)
ALTER TABLE YourTable
ADD SeqNo INT IDENTITY(1,1)
IDENTITY(1,1) 表示第一条记录的SeqNo值为1,然后每插入一条记录就加1
您可以使用带有 IDENTITY(1,1)
列的暂存 table,每次执行包时都必须 TRUNCATE
table 重置 IDENTITY
.所以每次都会从1
开始
或者您可以使用脚本组件编写自己的逻辑
有两种方法可以实现:
(1) 为什么不使用脚本组件?
我觉得使用脚本组件效率更高,控制性更好,可以自己写逻辑
- 在数据流任务中添加一个脚本组件
- 添加
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 Input0_ProcessInputRow(ByVal Row As Input0Buffer)
CurrentID += 1
Row.NewID = CurrentID
End Sub
End Class
在OLEDB Destination
中,将NewID
列映射到目标标识列
(2) 使用分段 Table
就像我在中提到的一样:
- 使用标识列
创建暂存table
- 每次截断 Table (这将重新启动身份),并将数据插入暂存 table
- 使用
DataFlow Task
或 Execute SQL Task
从暂存 table 插入数据
我有一个 SSIS 包,其中有两条记录。我需要在 table 中插入带有额外列(比方说序列)的记录。如果有两条记录,Sequence 列的值应为 1(对于第一条记录)和 2(对于第二条记录)。同样,下一次,我得到三个记录,然后序列再次从 1,2 和 3 开始。
是否可以在不使用脚本或存储过程的情况下执行此操作?
截图:
您可以在数据库本身中实现这一点,而无需在 SSIS 包中添加逻辑。只需使用 IDENTITY 向目标 table 添加一个列,它就会自动递增。无需在 SSIS 中添加一些额外的逻辑
您可以通过更改 Table
添加 IDENTITY 列(如果 Table 上还没有)ALTER TABLE YourTable
ADD SeqNo INT IDENTITY(1,1)
IDENTITY(1,1) 表示第一条记录的SeqNo值为1,然后每插入一条记录就加1
您可以使用带有 IDENTITY(1,1)
列的暂存 table,每次执行包时都必须 TRUNCATE
table 重置 IDENTITY
.所以每次都会从1
或者您可以使用脚本组件编写自己的逻辑
有两种方法可以实现:
(1) 为什么不使用脚本组件?
我觉得使用脚本组件效率更高,控制性更好,可以自己写逻辑
- 在数据流任务中添加一个脚本组件
- 添加
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 Input0_ProcessInputRow(ByVal Row As Input0Buffer) CurrentID += 1 Row.NewID = CurrentID End Sub End Class
在
OLEDB Destination
中,将NewID
列映射到目标标识列
(2) 使用分段 Table
就像我在
- 使用标识列 创建暂存table
- 每次截断 Table (这将重新启动身份),并将数据插入暂存 table
- 使用
DataFlow Task
或Execute SQL Task
从暂存 table 插入数据