将存储过程结果关联到SSIS变量


9

我试图将存储过程中的值放入SSIS变量中,然后进行测试以查看如果我添加了一个表达式,两个SSIS任务是否可以工作。因此,例如,我尝试使用存储过程:

在此处输入图片说明

也许我什至在设置SSIS变量属性时都完全错了,因为我也不知道我是否对存储的proc值导入SSIS变量的方法是否正确。如果您还需要其他任何屏幕截图,请告诉我。

这是任务示例:

在此处输入图片说明

这是优先约束编辑器的屏幕截图:

在此处输入图片说明

这是第一个任务的属性:

在此处输入图片说明

我希望它根据这种情况前进(或失败)。但是,当我对其进行测试时,该过程无论从第一个任务流向第二个任务,仅向我显示第一个任务的“ 100%完成”,而与它是否检查此表达式是否正确无关。我该怎么办?出了什么问题?我在SSIS中确实有一个名为“ orderCount”的变量,用于从存储的proc中获取值。


1
在您的第一个Execute SQL任务中,您需要将存储过程的输出分配回给@[User::orderCount]
Mark Sinkinson

它会放在那个窗口的某个地方吗?(我刚刚添加为后期编辑的最后一张图片)
Ravi 2015年

1
抱歉,在Result Set页面上。simple-talk.com/sql/ssis/...
马克Sinkinson

非常感谢,做到了!它通过了第一个任务,然后继续执行第二个任务。我希望它不会继续,因为我设置了一个表达式,试图说“如果传递给该变量的值小于5,请不要执行下一个任务”。
拉维2015年

@Jaywant在第二项任务上,尝试为“ Disable”属性设置一个表达式,例如@[User::orderCount]<5?(dt_bool)1:(dt_bool)0。如果成功,不要忘记将结果发布回该线程。GL!
彼得·范迪维尔

Answers:


10

您有两种选择可以使这项工作。您可以使用单个结果集也可以使用OUTPUT参数。您当前未正确使用这两种方法。

输出参数

您的存储过程被定义为具有@OrderCount方向为的参数OUTPUT

如果您想在SSMS,.NET等工具中使用存储过程,那么看起来就像

DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;

无需指定即可运行上面的命令,OUTPUT而是查看@orderCount的值是有效的。从1435变为0。

当您在SSIS中使用“执行SQL任务”时,也是如此。您必须指定该参数在OUTPUT上,并且还必须在“参数映射”选项卡中指定它。

指定OUTPUT子句和参数占位符

还要指定要映射的变量,并在那里使用OUTPUT方向。在这里,我将结果映射到名为Int32类型的SSIS变量中orderCount

在此处输入图片说明

单一结果集

您已经掌握了正确的第一部分-您已将结果集指定为“单行”。

您会注意到我正在使用,EXECUTE dbo.TestStoredProcSSVariable ?因为您必须指定一个输入值,否则proc调用将中断(至少按照您的定义)。您可能用硬编码代替了?类似的值0

在此处输入图片说明

然后,在“结果集”选项卡上,在这里我将第一列(第零个序数)映射到名为 orderCountb

在此处输入图片说明

如果运行提供的存储过程,则orderCountb中将不会获得值。为什么?因为您没有从存储过程调用中返回任何内容。我在的存储过程中添加了最后一条语句

SELECT @OrderCount AS OrderCount;

自己做

您可以使用以下biml探索这两种方法。什么是Biml?商业智能标记语言是BI的操作系统。您之所以关心它,是因为它将允许您将一些XML转换为SSIS包。您需要做的就是下载并安装免费的插件BIDS Helper。

安装BIDS Helper之后,

  1. 右键单击该项目,然后选择添加新的Biml文件
  2. 用以下XML替换文件的内容
  3. 修正第5行中的值。将升级Data Source到真实服务器并Provider与您的SSIS版本保持一致。查看您的屏幕截图,它很可能是SQLNCLI10.1
  4. 右键单击BimlScript.biml,然后选择“生成SSIS包”

Bimlscript.biml

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <Connection
            Name="tempdb"
            ConnectionString="Data Source=.\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;"
            />
    </Connections>
    <Packages>
        <Package
            Name="dba_114775"
            ConstraintMode="Linear"
        >
            <Tasks>
                <ExecuteSQL
                    ConnectionName="tempdb"
                    Name="SQL Make procedure">
                    <DirectInput>
                        <![CDATA[IF EXISTS
(
    SELECT
        *
    FROM
        sys.procedures AS P 
        INNER JOIN 
            sys.schemas AS S
            ON S.schema_id = P.schema_id
    WHERE
        S.name = 'dbo'
        AND P.name = 'TestStoredProcSSVariable'
)
BEGIN
    DROP PROCEDURE dbo.TestStoredProcSSVariable
END
GO
CREATE PROCEDURE dbo.TestStoredProcSSVariable
(
    @OrderCount int OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON;

    SET @OrderCount = 1135;
    SELECT @OrderCount AS OrderCount;
END

GO

]]>
                    </DirectInput>

                </ExecuteSQL>
                <Container Name="SEQC Result set" ConstraintMode="Linear">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SQL Make procedure.Output"></Input>
                        </Inputs>
                    </PrecedenceConstraints>
                    <Tasks>
                        <ExecuteSQL
                              ConnectionName="tempdb"
                              ResultSet="SingleRow"
                              Name="SQL SingleRow">
                            <DirectInput>EXECUTE dbo.TestStoredProcSSVariable ?;</DirectInput>
                            <Results>
                                <Result VariableName="User.orderCountb" Name="0" />
                            </Results>
                            <Parameters>
                                <Parameter DataType="Int32" VariableName="User.orderCountb" Name="0" />
                            </Parameters>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="Execute SQL Task 2">
                            <DirectInput>SELECT 1;</DirectInput>
                            <PrecedenceConstraints>
                                <Inputs>
                                    <Input 
                                        OutputPathName="SQL Placeholder.Output" 
                                        EvaluationOperation="ExpressionAndConstraint" 
                                        EvaluationValue="Success" 
                                        Expression="@[orderCount] &lt; 5" />
                                </Inputs>
                            </PrecedenceConstraints>
                        </ExecuteSQL>
                    </Tasks>
                </Container>
                <Container Name="SEQC Output Parameter" ConstraintMode="Linear">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SQL Make procedure.Output"></Input>
                        </Inputs>
                    </PrecedenceConstraints>
                    <Tasks>
                        <ExecuteSQL
                              ConnectionName="tempdb"
                              Name="SQL Output parameter">
                            <DirectInput>EXECUTE dbo.TestStoredProcSSVariable ? OUTPUT;</DirectInput>
                            <Parameters>
                                <Parameter 
                                    DataType="Int32" 
                                    VariableName="User.orderCount" 
                                    Name="0" 
                                    Direction="Output" />
                            </Parameters>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="Execute SQL Task 2">
                            <DirectInput>SELECT 1;</DirectInput>
                            <PrecedenceConstraints>
                                <Inputs>
                                    <Input 
                                        OutputPathName="SQL Placeholder.Output" 
                                        EvaluationOperation="ExpressionAndConstraint" 
                                        EvaluationValue="Success" 
                                        Expression="@[orderCount] &lt; 5" />
                                </Inputs>
                            </PrecedenceConstraints>
                        </ExecuteSQL>

                    </Tasks>
                </Container>
                <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                    <DirectInput>SELECT 1;</DirectInput>
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SEQC Result set.Output" />
                            <Input OutputPathName="SEQC Output Parameter.Output" />
                        </Inputs>
                    </PrecedenceConstraints>
                </ExecuteSQL>
            </Tasks>
            <Variables>
                <Variable DataType="Int32" Name="orderCount">-1</Variable>
                <Variable DataType="Int32" Name="orderCountb">-1</Variable>
            </Variables>
        </Package>
    </Packages>
</Biml>

享受以下SSIS包

在此处输入图片说明


这是非常有用和有益的,非常感谢Billinkc!极有帮助的帖子!非常感谢!
拉维2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.