在SSIS中执行SP不返回任何内容

时间:2015-05-26 13:55:34

标签: sql-server stored-procedures ssis

到目前为止,我一直在寻找从SSIS执行sp的可能解决方案,但任何事情似乎都有效。我有一个sp:

CREATE PROCEDURE [DBO].[SPIDENTIFIERS] @IDENT NVARCHAR(MAX) OUTPUT

我需要的是将结果保存在我在SSIS中创建的变量中。

这是我过去尝试过的配置。

enter image description here

在参数设置部分中,我还使用了Direction作为Output或ReturnValue但是我收到了一条错误消息。只是为了尝试我放一个脚本任务来判断价值,但正如你所看到的那样,这是空的。

使用Direction Ouput或ReturnValue,我得到了这个:

[Execute SQL Task] Error: Executing the query "EXECUTE  spIdentifiers ? OUTPUT;" failed with the following error: 
    "El valor no está dentro del intervalo esperado.". 
    Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, 
    parameters not set correctly, or connection not established correctly.

在任务配置中我缺少什么?

我在这篇文章中寻找答案。但似乎没有任何效果

How do you call a Stored Procedure in SSIS?

SSIS Stored Procedure Call

提前致谢。

4 个答案:

答案 0 :(得分:2)

你的参数不应该被命名,正如@gerald Davis指出的那样。对于OLEDB类型的连接管理器,它应该是基于序数的,因此为0

enter image description here

这是我的示例包,你可以看到我的变量@[User::MyVariables]填充了很多X

enter image description here

这是我的proc定义

IF NOT EXISTS
(
    SELECT
        *
    FROM
        sys.procedures AS P
    WHERE
        P.name = N'SPIDENTIFIERS'
)
BEGIN
    EXECUTE sys.sp_executesql N'CREATE PROC dbo.spidentifiers AS SELECT ''stub version, to be replaced''';
END
GO
ALTER PROCEDURE [DBO].[SPIDENTIFIERS] 
(
    @IDENT NVARCHAR(MAX) OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON;
    SET @IDENT = REPLICATE(CAST(N'X' AS nvarchar(MAX)), 4001);
    -- Uncomment this to watch the fireworks
    --SET @IDENT = REPLICATE(CAST(N'X' AS nvarchar(MAX)), 4001);
END

BIML

我非常喜欢使用商业智能标记语言Biml来描述我的解决方案,因为它允许读者重新创建我描述的解决方案而不需要点击那些麻烦的鼠标。

  1. 下载BIDS Helper并安装或解压缩
  2. 将新的biml文件添加到您的SSIS项目
  3. 修复第三行的ConnectionString以指向有效的服务器和数据库。我的引用是localhost \ dev2014和tempdb
  4. 右键单击已保存的biml文件并生成包
  5. 你当之无愧的Biml休息
  6. Biml代码如下

    <Biml xmlns="http://schemas.varigence.com/biml.xsd">
        <Connections>
            <OleDbConnection Name="tempdb" ConnectionString="Provider=SQLNCLI11.1;Server=localhost\dev2014;Initial Catalog=tempdb;Integrated Security=SSPI;" />
        </Connections>
        <Packages>
            <Package Name="so_30460630" ConstraintMode="Linear">
                <Variables>
                    <Variable DataType="String" Name="MyVariables">0</Variable>
                </Variables>
                <Tasks>
                    <ExecuteSQL
                        ConnectionName="tempdb"
                        Name="SQL Ensure Objects Exist">
                        <DirectInput>
                            <![CDATA[IF NOT EXISTS
    (
        SELECT
            *
        FROM
            sys.procedures AS P
        WHERE
            P.name = N'SPIDENTIFIERS'
    )
    BEGIN
        EXECUTE sys.sp_executesql N'CREATE PROC dbo.spidentifiers AS SELECT ''stub version, to be replaced''';
    END
    GO
    ALTER PROCEDURE [DBO].[SPIDENTIFIERS] 
    (
        @IDENT NVARCHAR(MAX) OUTPUT
    )
    AS
    BEGIN
        SET NOCOUNT ON;
        SET @IDENT = REPLICATE(CAST(N'X' AS nvarchar(MAX)), 4001);
    END
    ]]>
                        </DirectInput>
                    </ExecuteSQL>
    
                    <ExecuteSQL
                        ConnectionName="tempdb"
                        Name="SQL Using an OUTPUT parameter">
                        <DirectInput>EXECUTE dbo.SPIDENTIFIERS ? OUTPUT;</DirectInput>
                        <Parameters>
                            <Parameter DataType="String" VariableName="User.MyVariables" Name="0" Direction="Output" Length="-1" />
                        </Parameters>
                    </ExecuteSQL>
    
                    <ExecuteSQL 
                        ConnectionName="tempdb" 
                        Name="SQL Breakpoint">
                        <DirectInput>SELECT NULL AS nothing;</DirectInput>
                    </ExecuteSQL>
                </Tasks>
    
            </Package>
        </Packages>
    </Biml>
    

答案 1 :(得分:0)

  1. UserID需要位于readwritevariable部分,而不是读取部分,以便您允许任务写入变量。
  2. 参数方向应为&#34;输出&#34;因为你把它从你的任务中传出而不是它。

答案 2 :(得分:0)

您的存储过程参数是OUTPUT,但您的SSIS包将其定义为INPUT。根据应用程序的不同,也可以使用RETURNVALUE,但是根据SP的语法,它使用输出参数而不是返回值。

验证User:Id变量是否具有正确的数据类型。尝试手动执行SSMS中的SP以验证它是否正常运行并返回预期结果。

我认为你正在混合OLEDB和ADO.NET语法。

如果使用OLEDB数据连接,那么你使用?查询中的参数和参数名称必须为“参数0 (和参数1,如果大于1,则等)”。 注意:参数名称为零索引。在SP中,如果参数超过1,则需要正确的顺序。

如果使用ADO.NET DataConnection ,则查询只是存储过程的命名,IsStoredProcedure = True,参数名称与SP中参数的名称匹配。

从截图中您当前使用的是命名参数和OLDEDB?句法。我不相信这是有效的。它取决于连接类型,是一种或另一种。

答案 3 :(得分:0)

  • 您需要将sql语句保留为“EXEC SPIDENTIFIERS?OUTPUT **
  • 变量的方向应该是输出在参数映射选项卡中,“参数名称”应该与存储过程中定义的输入参数完全相同,或者你可以使用 0 而不是给出实际的名字。