【问题标题】:SSIS 2008 using the same variable for a row count and a script componentSSIS 2008 对行数和脚本组件使用相同的变量
【发布时间】:2011-08-05 12:42:12
【问题描述】:

我有一个行计数组件,它使用全局变量 X 来存储数字;到目前为止,它是规则的,但是如果我添加一个在其 ReadOnly 变量中包含 X 的脚本组件,然后在其中出于某种目的使用它,则流程会暂停一会儿,然后它会崩溃,说行数需要一个有效的变量。

是否可以将行数存储在变量中,然后从脚本中读取该变量。 ?

【问题讨论】:

    标签: sql-server-2008 ssis sql-server-2008-r2 etl business-intelligence


    【解决方案1】:

    您不能在同一数据流的其他任何地方使用在行计数转换中填充的变量。在数据流的 PreExecute 阶段,Row Count 锁定变量。尝试在脚本组件中使用变量会使脚本(同时)尝试相同的事情,因此 SSIS 会引发错误。

    但即使这没有发生,这也是正在发生的事情。当您的数据流正常工作并且行传递到行计数时,它实际上并没有用行计数填充 SSIS 变量。这将是非常低效的,因为行数实际上是一个 COM 组件,而 SSIS 变量是 .Net。使用来自 COM 的 .Net 资源是“昂贵的”,反之亦然。因此,行计数将值累加到本地代码变量中。在 PostExecute 阶段,Row Count 然后将它收集的值推送到 SSIS 变量中。关键是 PostExecute 阶段发生在数据流完成之后。如果您能够在数据流中间的任何时间查看变量(有多种方法),您会看到它的值为零(或在数据流开始之前设置的任何值)。

    如果您想使用行数来执行条件操作,或更新流中的行,您有几个选择:

    • 您可以将数据流拆分为两个数据流。使用 RAW 文件或 SQL 表在流程 #1 的末尾保留“正在进行的”数据,以便您可以在流程 #2 的开头使用它。
    • 您可以使用 Multicast 复制流,使用 Aggregate 组件对其进行计数,然后进行交叉连接以将行计数添加到每一行。 (见Performing a Cross-Join (Cartesian Product) in SSIS。)

    【讨论】:

      【解决方案2】:

      不,我认为Row Count 中使用的变量也不能用于Script Component

      我的理解是该变量在行计数转换中被锁定以进行写入,并且在脚本组件转换中不可用。

      那么,你想对脚本组件中的变量做什么?如果您可以指定您的要求,可能有人可以提出替代方案。

      此链接中的文章建议了一种方法:http://consultingblogs.emc.com/jamiethomson/archive/2007/02/28/SSIS-Nugget_3A00_-Output-the-rowcount.aspx

      【讨论】:

      • 感谢湿婆;我要做的就是在我的脚本中获取这个变量的值。
      • Siva 你的链接和我做的事情几乎一样,仍然有一个填充变量的行数和一个读取它的脚本。它会失败
      【解决方案3】:

      我们也可以在脚本任务中使用相同的变量“Rowcount”...仅当该变量的范围处于包级别时。[全局变量]。

      【讨论】:

        【解决方案4】:

        大多数时候,我在控制流中使用脚本,在数据流中使用行数。 1)如果您想要计数首先在控制流中进行数据流任务(它将执行行计数活动)。 2)然后将脚本拖到它下面并使用行数。

        这里是同样的例子。 http://www.c-sharpcorner.com/uploadfile/muralidharan.d/how-to-use-rowcount-in-ssis/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 2014-01-27
          • 1970-01-01
          相关资源
          最近更新 更多