Sql server 2005 从Oracle视图获取SSIS中的表计数
在我的SSIS包中,我想查看特定的Oracle视图中是否包含数据。 我有一个带有select count语句的Execute SQL任务:Sql server 2005 从Oracle视图获取SSIS中的表计数,sql-server-2005,oracle,ssis,Sql Server 2005,Oracle,Ssis,在我的SSIS包中,我想查看特定的Oracle视图中是否包含数据。 我有一个带有select count语句的Execute SQL任务: Select CAST( count(*) as Integer) As Row_Count from OWNER.VIEW_MV 我的RowCount在结果集中,指向我的变量User:TableCount。如果将TableCount设置为除Object之外的任何值,则会出现如下错误: 检查中的数据时出错:0xC002F309 查看、执行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表是否为空,然后根据这些信息采取行动的最佳方法是什么?本质上,我们希望得到有关空表的错误消息,而不是在流程中继续
更新:
我已尝试从OWNER.VIEW\u MV中选择CAST(count(*)as char)作为Row_count,其中ROWNUM<2,并将其发送到char类型的SSIS变量。我已将其转换为数值和整数,SSIS变量为Int32、Int64。我尝试了使用SSIS类型字符串的varchar2(20)。除SSIS数据类型对象外,所有内容都会出错
现在,我保存为datatype对象,但当我尝试获取值时,将nTableCount设置为String,我可以使用nTableCount=Dts.Variables(“TableCount”).value().ToString(),但它返回0。如何从对象变量中提取该字符串?(当然,假设它实际将其放入其中。)我对SSI一无所知,因此无法在这方面帮助您,但是,请注意,如果您只想检查表中是否存在数据,那么在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)
选择计数(*)
从桌子上
其中ROWNUM<2;
(如果表为空,则返回0;如果表中有任何行,则返回1)
通过这种方式,Oracle可以在找到任何行后立即停止从表/视图读取结果,因此(可能)更快地完成查询的执行。SSIS在与Oracle对话时遇到很多问题。我以前遇到过。您尝试过使用字符串数据类型吗?在脚本中将字符串转换为整数不会有问题。我找到了一个解决方案。它可能是最好的解决方案,也可能不是最好的解决方案,但它会起作用。其他解决方案和改进也正在进行中欢迎光临 首先,我没有使用SQL任务,而是使用Oracle源代码的数据流任务,数据访问模式是一个SQL命令,原始命令如问题所示(不过,一旦它正常工作,我可能会使用cagcowboy的建议) 输出是一个目标脚本转换。我选择了ROW_COUNT作为输入列,没有弄乱输入和输出,并且为脚本选择了my 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()
我想我应该对数据类型做更多的处理,因为此时似乎不需要将其转换为字符串。但这没关系,我现在可以确定视图中是否有数据,并相应地进行分叉。这对我来说很有效。想法是将count(*)转换为char,并在SSIS中使用字符串类型变量:
SELECT TO_CHAR(COUNT(*)) FROM yourtable;