Stored procedures 无效的对象名称'#结果';在数据流中使用sp时的SSI

Stored procedures 无效的对象名称'#结果';在数据流中使用sp时的SSI,stored-procedures,ssis,Stored Procedures,Ssis,我有一个在SQL Management Studio中运行良好的存储过程,但在SSIS 2008 R2中运行它时遇到问题。如果我将其作为executesql任务运行,它运行良好,没有任何错误,但当我将其作为数据流任务中的ADO NET源使用时,会收到错误消息 无效的对象名称#结果(Microsoft SQL Server,错误:208) 但是,当我单击“预览”时,确实会显示数据行 我没有修改存储过程的访问权限,因此我不确定存储过程本身内部发生了什么,但正如我前面所说的,我可以在managemen

我有一个在SQL Management Studio中运行良好的存储过程,但在SSIS 2008 R2中运行它时遇到问题。如果我将其作为
executesql任务运行
,它运行良好,没有任何错误,但当我将其作为数据流任务中的ADO NET源使用时,会收到错误消息

无效的对象名称#结果(Microsoft SQL Server,错误:208)

但是,当我单击“预览”时,确实会显示数据行


我没有修改存储过程的访问权限,因此我不确定存储过程本身内部发生了什么,但正如我前面所说的,我可以在management studio中运行存储过程,也可以在SSIS中的执行SQL任务中使用存储过程

SSIS中的一个步骤是元数据验证——合同规定我们应该有一个整数,然后是一个字符大小8。当数据流数据库源组件(ado或ole)试图获取其元数据时,基本上就是对找到的第一个查询进行归纳

这里的方法与我们在存储过程中处理动态表时使用的方法相同。更改存储过程(您已指定不能执行此操作),以向SSIS提供有关预期元数据的提示

CREATE PROCEDURE dbo.Sample
AS
BEGIN
    SET NOCOUNT ON;

    -- Any condition that will never evaluate to true
    IF NULL = NULL
    BEGIN
        -- SSIS will key off of this query even
        -- though it is impossible for this branch to ever execute
        -- So, define our metadata here
        SELECT 
            CAST(NULL AS int) AS MyFirstColumn
        ,   CAST(NULL as char(8)) AS SomeCodeColumn;
    END

    -- Assume complex queries here that banjax the metadata
    -- yet ultimately return the actual data
    SELECT TOP 1000 
        CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS int) AS MyFirstColumn
    ,   CAST(LEFT(AC.name, 8) AS char(8)) AS SomeCodeColumn 
    INTO 
        #RubeG
    FROM 
        sys.all_columns AS AC;

    SELECT
        RG.MyFirstColumn
    ,   RG.SomeCodeColumn
    FROM
        #RubeG AS RG;

END
对于SQL Server 2012+的源代码,您可以尝试为执行调用指定
WITH RESULT set
属性

EXECUTE dbo.Sample
WITH RESULT SETS
(
    (
        c1 bigint
    ,   c2 varchar(8)
    )
);
Biml biml包定义示例

  • 下载并安装
  • 打开/创建集成服务项目类型
  • 添加新的biml文件
  • 粘贴以下定义
  • 调整第5行(对于OLE)和第8行(对于ADO.NET)中的连接字符串值
  • 确保存储过程dbo.Sample存在
  • 如果使用2008数据库,则删除DFT样本结果集
  • 代码在这里

    <Biml xmlns="http://schemas.varigence.com/biml.xsd">
        <Connections>
            <Connection
                Name="tempdb"
                ConnectionString="Data Source=.\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;"
                />
            <AdoNetConnection
                Name="CM_ADO"
                ConnectionString="Data Source=localhost\dev2014;Integrated Security=SSPI;Connect Timeout=30;Database=tempdb;"
                Provider="SQL"
            />
    
        </Connections>
        <Packages>
            <Package Name="so_31206473">
    
                <Tasks>
                    <Dataflow Name="DFT Sample">
                        <Transformations>
                            <OleDbSource ConnectionName="tempdb" Name="OLESRC dbo_Source">
                                <DirectInput>EXECUTE dbo.Sample</DirectInput>
                            </OleDbSource>
                            <DerivedColumns Name="DER Placeholder" />
                        </Transformations>
                    </Dataflow>
                    <Dataflow Name="DFT Sample RESULTS SET">
                        <Transformations>
                            <OleDbSource ConnectionName="tempdb" Name="OLESRC dbo_Source RS">
                                <DirectInput>
                                    <![CDATA[EXECUTE dbo.Sample
    WITH RESULT SETS
    (
        (
            c1 bigint
        ,   c2 varchar(8)
        )
    );]]>
                                </DirectInput>
                            </OleDbSource>
                            <DerivedColumns Name="DER Placeholder" />
                        </Transformations>
                    </Dataflow>
    
                    <Dataflow Name="DFT SampleADO">
                        <Transformations>
                            <AdoNetSource ConnectionName="CM_ADO" Name="ADOSRC dbo_Sample">
                                <DirectInput>EXECUTE dbo.Sample</DirectInput>
                            </AdoNetSource>
                            <DerivedColumns Name="DER Placeholder" />
                        </Transformations>
                    </Dataflow>
    
                    <Dataflow Name="DFT SampleADO RESULTS SET">
                        <Transformations>
                            <AdoNetSource ConnectionName="CM_ADO" Name="ADOSRC dbo_Sample">
                                <DirectInput>
                                    <![CDATA[EXECUTE dbo.Sample
    WITH RESULT SETS
    (
        (
            c1 bigint
        ,   c2 varchar(8)
        )
    );]]>
                                </DirectInput>
                            </AdoNetSource>
                            <DerivedColumns Name="DER Placeholder" />
                        </Transformations>
                    </Dataflow>
    
                </Tasks>
            </Package>
        </Packages>
    
    </Biml>
    
    
    执行dbo.Sample
    执行dbo.Sample
    
    OLE源的元数据示例

    使用OLE源的结果集元数据


    对于ADO.NET提供者,结果是一样的,我只是在构建屏幕截图时没有注意到问题的细微差别。更新后的Biml使添加这些内容变得很简单。

    很荣幸能回答您自己的问题!你可以让它空着。这使堆栈溢出成为一个更好的地方!