【问题标题】:Get a table count in SSIS from an Oracle view从 Oracle 视图获取 SSIS 中的表计数
【发布时间】:2009-09-08 18:23:05
【问题描述】:

在我的 SSIS 包中,我想查看特定的 Oracle 视图中是否有数据。 我有一个带有 select count 语句的执行 SQL 任务:

Select CAST( count(*) as Integer) As Row_Count from OWNER.VIEW_MV

我的 RowCount 在结果集中,指向我的变量 User:TableCount。如果我将 TableCount 设置为 Object 以外的任何值,我会收到如下错误:

错误:检查数据时出现 0xC002F309 查看,执行 SQL 任务:错误 赋值时发生 变量“TableCount”:“的类型 分配给变量的值 “User::TableCount”不同于 当前变量类型。变量可能 在执行期间不改变类型。 变量类型是严格的,除了 Object 类型的变量。

但是,如果我确实将数据类型设置为对象,那么在我的下一步脚本任务中,当我读取该对象时,我看不到如何将其转换为整数以便我可以使用和查看它。然后我得到错误:

从“Object”类型到“Integer”类型的转换无效。

用代码

Dim nTableCount As Int32
nTableCount = CInt(Dts.Variables("TableCount").Value)

也许我正在处理这个错误。确定 Oracle 表是否为空,然后根据该知识采取行动的最佳方法是什么?本质上,我们想要一条关于空表的错误消息,而不是继续我们的流程。

更新: 我试过 Select CAST(count(*) as char) As Row_Count from OWNER.VIEW_MV where ROWNUM

现在,我保存为数据类型 Object,但是当我尝试获取值时,将我的 nTableCount 设置为字符串,我可以使用 nTableCount = Dts.Variables("TableCount").Value().ToString() ,但它返回 0。如何从 Object 变量中提取该字符串? (当然,假设它真的把它放在那里。)

【问题讨论】:

    标签: sql-server-2005 oracle ssis


    【解决方案1】:

    我对 SSIS 一无所知,因此无法帮助您,但请注意,如果您只想检查表中是否存在数据,在 SQL 中包含 ROWNUM 子句会更有效。例如

    SELECT COUNT(*)
    FROM   table
    WHERE  ROWNUM < 2;
    
    (will return 0 if the table is empty, 1 if any rows are in the table)
    

    这样,Oracle 可以在找到任何行后立即停止从表/视图中读取结果,从而(可能)更快地完成查询的执行。

    【讨论】:

      【解决方案2】:

      SSIS 在与 Oracle 的沟通中遇到了很多麻烦。我之前遇到过similar issues。您是否尝试过使用字符串数据类型?在脚本中将字符串转换为整数不会有问题。

      【讨论】:

        【解决方案3】:

        我找到了解决方案。它可能是也可能不是最好的解决方案,但它会起作用。其他解决方案和改进总是受欢迎的。

        首先,我没有 SQL 任务,而是有一个 Oracle 源的数据流任务,数据访问模式是一个 SQL 命令,问题中显示了原始命令(尽管,我可能会使用 cagcowboy 的建议)工作正常)。

        输出是一个目标脚本转换。我选择 ROW_COUNT 作为我的输入列,没有弄乱输入和输出,并且为脚本选择了我的 TableCount 作为 ReadWriteVariables。我的脚本如下:

        Public Class ScriptMain
            Inherits UserComponent
            Dim ScriptCount As Single
        
            Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
                ' Assign the variable to something outside of the sub
                ScriptCount = Row.ROWCOUNT
            End Sub
        
            Public Overrides Sub PostExecute()
                ' Variable is only available to set in PostExecute
                Me.Variables.TableCount = ScriptCount
            End Sub
        
        End Class
        

        我的公共变量是 Double 类型,在我的最终脚本任务中(数据流之外),我只需使用行来访问它

        Dim nTableCount As String
        nTableCount = Dts.Variables("TableCount").Value().ToString()
        

        我怀疑我应该对数据类型做更多的事情,因为此时似乎不需要将其转换为字符串。不过没关系,我现在可以确定视图中是否有数据,并据此进行分叉。

        【讨论】:

          【解决方案4】:

          这对我有用。想法是将 count(*) 转换为 char 并在 SSIS 中使用 String 类型变量:

          SELECT TO_CHAR(COUNT(*)) FROM yourtable;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-20
            • 1970-01-01
            • 2017-10-16
            • 1970-01-01
            相关资源
            最近更新 更多