从Oracle视图中获取SSIS中的表计数

时间:2009-09-08 18:23:06

标签: sql-server-2005 oracle ssis

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

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

我的RowCount位于结果集中,指向我的变量用户:TableCount。如果我将TableCount设置为除Object之外的任何内容,则会出现错误,例如:

  

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

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

  

从“对象”类型转换为“整数”类型无效。

代码

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

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

更新 我已经尝试过选择CAST(count(*)as char)作为来自OWNER.VIEW_MV的Row_Count,其中ROWNUM< 2,并将其发送到char类型的SSIS变量。我把它转换为Numeric和Integer,使用Int32,Int64的SSIS变量。我尝试过使用SSIS类型String的varchar2(20)。除了SSIS数据类型Object之外,所有内容都会出错。

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

4 个答案:

答案 0 :(得分:1)

我对SSIS一无所知,所以无法帮助您,但是,作为一个注释,如果您只想检查表中是否存在数据,则在SQL中包含ROWNUM子句会更有效。 e.g。

SELECT COUNT(*)
FROM   table
WHERE  ROWNUM < 2;

(will return 0 if the table is empty, 1 if any rows are in the table)

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

答案 1 :(得分:1)

SSIS与Oracle交谈时遇到很多麻烦。我之前遇到过similar issues。你尝试过使用字符串数据吗?您不会在脚本中将字符串转换为整数。

答案 2 :(得分:0)

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

首先,我没有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()

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

答案 3 :(得分:0)

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

SELECT TO_CHAR(COUNT(*)) FROM yourtable;