执行SQL任务中的SSIS返回变量

时间:2015-02-09 21:00:41

标签: ssis sql-server-2012 return-value

我有一个关于如何在SSIS中的执行SQL任务中使用'返回值'参数的问题。我看到'参数映射'中有3种类型的参数 - 输入值,输出值和返回值。我完全理解如何使用输入值和输出值。但是当我尝试设置参数类型是'返回值'时,它无法工作。下面是我的SQL Server存储过程以及我在执行SQL任务中所做的。

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

在SSIS执行SQL任务中,我设置(抱歉我无法上传图像)

  1. 连接类型:OLE DB
  2. 参数映射:变量名称:User :: @ random(我在SSIS中设置SSIS用户参数:随机INT32),方向:ReturnValue,类型:数字,参数名称:@random

  3. SQL语句:

    Declare @r int = @random EXEC @r = spRandomReturn
    
  4. 我在SSIS中创建了一个返回值,但是它无法正常工作并且总是出错。

1 个答案:

答案 0 :(得分:4)

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

因此,您的查询变为

EXECUTE ? = [dbo].[spRandomReturn]

在你的参数映射中,你有

enter image description here

生殖

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

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

我创建了一个名为so_28419264的包。这个包包含2个变量。一个是Query,其中包含第一位代码。第二个是ReturnValue,我们将使用它来捕获Mapping选项卡上的返回值。我将这个初始化为-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>

结果

它有效

enter image description here