如何更新数据流 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 Sets

2 - 使用脚本组件增加每一行的 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 中的变量值?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 调试器显示不正确的变量值

更改 SQL 列的数据类型时更新 SSIS 包

如何在 ActionScript 类中实现数据绑定?

通过查看Windbg中的变量值去定位C++软件异常问题

如何将过程中的变量值传递给 Apex 中的 Javascript 函数

在SSIS脚本组件中创建时,变量不包含回车符