将存储过程结果分配给 SSIS 变量

Rav*_*avi 9 sql-server ssis

我试图将存储过程中的值获取到 SSIS 变量中,然后测试以查看如果我添加了表达式,两个 SSIS 任务是否可以工作。所以举个例子,我试图使用这个存储过程:

在此处输入图片说明

也许我什至完全错误地设置了 SSIS 变量属性,因为我也不确定我是否以正确的方式将存储的 proc 值导入到 SSIS 变量中。如果您还需要其他任何屏幕截图,请告诉我。

这是任务示例:

在此处输入图片说明

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

在此处输入图片说明

这是第一个任务的属性:

在此处输入图片说明

我希望它根据这种情况前进(或失败)。但是当我测试它时,不管怎样,过程都会从第一个任务流向第二个任务,并且只向我显示第一个任务的“100% 完成”,而没有关于它是否检查这个表达式是否为真。我怎么能做这样的事情,出了什么问题?我在 SSIS 中有一个名为“orderCount”的变量,用于从存储过程中获取值。

bil*_*nkc 11

您有两种选择来完成这项工作。您可以使用单个结果集也可以使用 OUTPUT 参数。您目前没有正确使用。

输出参数

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

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

DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;
Run Code Online (Sandbox Code Playgroud)

在不指定的情况下运行上述内容是有效的,OUTPUT但查看@orderCount 的值。它从 1435 变为 0。

在 SSIS 中使用“执行 SQL 任务”时也是如此。您必须指定该参数位于 OUTPUT 上,并在 Parameter mappings 选项卡中指定它。

指定 OUTPUT 子句和参数占位符

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

在此处输入图片说明

单一结果集

你有正确的第一部分 - 你已经指定结果集是单行。

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

在此处输入图片说明

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

在此处输入图片说明

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

SELECT @OrderCount AS OrderCount;
Run Code Online (Sandbox Code Playgroud)

自己做

您可以使用以下 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 包

脚本文件

<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>
Run Code Online (Sandbox Code Playgroud)

享受以下 SSIS 包

在此处输入图片说明