在我的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变量中提取该字符串? (当然,假设它确实把它放在那里。)
答案 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;