如何更新数据流 ssis 中的变量值?
Posted
技术标签:
【中文标题】如何更新数据流 ssis 中的变量值?【英文标题】:How to update variable value in Data Flow ssis? 【发布时间】:2019-07-21 14:40:59 【问题描述】:我是 SSIS 的新手,遇到以下问题。
可以使用 SQL 在数据流中更新变量吗?例如,我需要分配数据库中可用的最大 ID 的数值(以及当 etl 运行时最大值发生变化)。所以我需要在插入每一行时更新变量。
这可能吗?还是其他方式?
我尝试过使用变量,但它的值在数据流中没有改变。我也得到了一些与数据流中的 OLE DB 命令脚本相关的答案,但我无法理解。
【问题讨论】:
假设有 7 行数据。处理第 1 行,获取 id 100(查询数据库以获取最大 ID 并添加 1)并存储。第 2 行已处理,它的 id 为 101 并存储,等等。这是您要尝试做的吗? 是的@billinkc。正是这个。 看看这个Q/A是否有用。 【参考方案1】:您必须分两步完成:
1 - 从 SQL 读取 Max ID 并将其存储到变量中
首先,您必须使用执行 SQL 任务将 SQL 表中的 Max ID 读取到变量中。您可以参考以下文章的分步指南:
SSIS Basics: Using the Execute SQL Task to Generate Result Sets2 - 使用脚本组件增加每一行的 ID
在将 Max ID 存储在变量中(例如:@[User::MaxID]
)之后,您必须在数据流任务中使用脚本组件来为每一行递增它。
在数据流任务中添加一个脚本组件转换,选择User::MaxID
作为只读变量,添加一个输出列(NewID)并使用类似的脚本(VB.NET中的示例)
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()
Base.PreExecute()
CurrentID = Dts.Variables.Item("User::MaxID").Value
End Sub
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
CurrentID += 1
Row.NewID = CurrentID
End Sub
End Class
类似帖子
Add incremental number while inserting records using SSIS【讨论】:
你好@hadi。谢谢你的解决方案。我认为您的解决方案可能会在少数“特定”条件下失败(对于我的问题)。我找到了两个解决方案,它们都使用 OLE DB 命令。我将详细发布它们。不过,感谢您的回复,它为我指明了正确的方向! @Bilal 但请注意 OLE DB 命令会降低性能,因为它在每一行上执行一个 sql 命令以上是关于如何更新数据流 ssis 中的变量值?的主要内容,如果未能解决你的问题,请参考以下文章