条件SSIS - 根据结果执行一项或另一项任务

时间:2018-01-15 14:27:36

标签: sql-server ssis expression etl operator-precedence

我在SSIS中有以下任务:

enter image description here

在Check Stock任务中,我执行一个返回0或1的存储过程:

    CREATE PROCEDURE [dbo].[SP_CheckStockAvailability]
AS

BEGIN

DECLARE @ItemGID nvarchar(250)=(SELECT TOP (1) ItemGID FROM XMLOrderlines WHERE Comparison='0')

SELECT CASE 
WHEN @ItemGID IS NOT NULL
THEN CAST (0 AS bit)
ELSE CAST (1 AS bit)
END AS Comparison
FROM XMLOrderlines 

END
GO

如果结果为1,我想执行Reject Order(右侧)任务,如果不是,则执行左侧的拒绝顺序。我设置为在变量Boolean数据类型中导出过程的结果,默认值为“False”。

如果我编辑优先约束并将Expression设置为评估操作,然后从上一个任务中选择变量,无论哪种方式都不会转到应该执行的下一个任务。我错过了什么?我尝试了我在网上找到的东西,但没有任何帮助我。谢谢!

enter image description here

3 个答案:

答案 0 :(得分:2)

尝试选择评估操作表达式和约束,表达式必须像@[User::Result] = 1一样。表达式必须返回TrueFalse

有关更多信息,请点击以下链接:

答案 1 :(得分:2)

解决方案

您必须设置以下值:

拒绝订单

Evaluation operation:   Expression and Constraint
Value:                  Success
Expression:             @[User::Result] = 1
                     OR 
                        @[User::Result]

接受订单

Evaluation operation:   Expression and Constraint
Value:                  Success
Expression:             @[User::Result] = 0 
                     OR 
                        !@[User::Result]

截图

enter image description here

建议

我认为最好在您的过程中添加TRY...CATCH块,因此如果遇到错误,结果将为1,订单将被拒绝:

CREATE PROCEDURE [dbo].[SP_CheckStockAvailability]
AS

    BEGIN

    BEGIN TRY  

        DECLARE @ItemGID nvarchar(250)=(SELECT TOP (1) ItemGID FROM XMLOrderlines WHERE Comparison='0')

        SELECT CASE 
        WHEN @ItemGID IS NOT NULL
        THEN CAST (0 AS bit)
        ELSE CAST (1 AS bit)
        END AS Comparison
        FROM XMLOrderlines 

    END TRY 
    BEGIN CATCH

        SELECT 1 AS Comparison

    END CATCH

    END
GO

答案 2 :(得分:1)

1 / True的表达式应为@[User::Result],而0 / False的表达式应为!@[User::Result] }(注意感叹号)。

您可能还希望将“表达式和约束”用作“评估操作”,因为没有它,无论“检查库存”是成功还是失败,流程都将继续(除非这是所需的行为)。 “约束”部分是“值”字段所代表的 - 在您的图像中它被设置为Failure,但是显示为灰色(由于仅选择了“表达式”)因此无效。