Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 从Oracle视图获取SSIS中的表计数_Sql Server 2005_Oracle_Ssis - Fatal编程技术网

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

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任务:错误

在我的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任务:错误 将值分配给时发生 变量“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;