1

我知道“参数映射”中有 3 种类型的参数 - 输入参数、输出参数和返回参数。我了解如何使用输入和输出参数。但是当我尝试将参数类型设置为“返回参数”时,它不起作用。下面是我的 SQL Server 存储过程。

ALTER Procedure [dbo].[spRandomReturn]
As 
Begin 
Return Convert(int, rand() * 10)
End

在 SSIS Execute SQL 任务中,我设置了

  1. 连接类型:OLE DB

  2. 参数映射:变量名:User::@random(我在SSIS中设置了一个User参数:random INT32),Direction:ReturnValue,Type:Numeric,Parameter Name:@random

  3. SQL 语句:

     Declare @r int = @random EXEC @r = spRandomReturn
    

我在 SSIS 中创建了一个返回参数,但它不起作用并引发错误。

4

1 回答 1

5

由于您使用的是 OLE DB 连接管理器,因此您需要使用?来指示参数的位置。

因此,您的查询变为

EXECUTE ? = [dbo].[spRandomReturn]

在您的参数映射中,您将拥有

在此处输入图像描述

再生产

Biml,商业智能标记语言,描述了商业智能平台。在这里,我们将使用它来描述 ETL。BIDS Helper是 Visual Studio/BIDS/SSDT 的免费插件,解决了它的许多缺点。具体来说,我们将使用将描述 ETL 的 Biml 文件转换为 SSIS 包的能力。这样做的另一个好处是为您提供了一种机制,可以准确地生成我所描述的解决方案,而不是单击许多繁琐的对话框。

您可以在下面的 XML 中看到,我创建了一个名为 CM_OLE 的连接,它指向 tempdb 中的 localhost\dev2014。您需要修改它以反映您的环境。

我创建了一个名为 so_28419264 的包。这个包包含 2 个变量。一个是Query包含第一位代码的。第二个是ReturnValue我们将用来捕获映射选项卡上的返回值。我将这个初始化为 -1,因为提供的存储过程永远不会产生负值。

我添加了两个任务,都是执行 SQL 任务。第二个什么都不做,它只是作为我设置断点的一个点。第一个执行 SQL 任务是我们调用存储过程并将结果分配给我们的变量的地方

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;Auto Translate=False;" />
    </Connections>
    <Packages>
        <Package ConstraintMode="Linear" Name="so_28419264">
            <Variables>
                <Variable DataType="String" Name="Query">EXECUTE ? = [dbo].[spRandomReturn];</Variable>
                <Variable DataType="Int32" Name="ReturnValue">-1</Variable>
            </Variables>
            <Tasks>
                <ExecuteSQL ConnectionName="CM_OLE" Name="SQL Demonstrate Return Value">
                    <VariableInput VariableName="User.Query" />
                    <Parameters>
                        <Parameter DataType="Int32" VariableName="User.ReturnValue" Name="0" Direction="ReturnValue" />
                    </Parameters>
                </ExecuteSQL>

                <ExecuteSQL ConnectionName="CM_OLE" Name="Put Breakpoint on me">
                    <DirectInput>SELECT 1;</DirectInput>                    
                </ExecuteSQL>                
            </Tasks>
        </Package>
    </Packages>
</Biml>

结果

有用

在此处输入图像描述

于 2015-02-09T21:26:43.207 回答