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

Conditional SSIS - execute one task or another based on the result

我在 SSIS 中有以下任务:

在 Check Stock 任务中,我执行了一个存储过程,其中 returns 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,我想执行拒绝订单(右侧)任务,如果不是,则执行左侧的任务。我设置将过程的结果导出到变量 Boolean 数据类型中,默认值为 "False"。

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

尝试选择求值操作表达式和约束,表达式必须类似于@[User::Result] = 1。表达式必须 return TrueFalse.

如需了解更多信息,请关注此 link:

1/True 的表达式应该是 @[User::Result],和你一样,0/False 的表达式应该是 !@[User::Result](注意感叹号)。

您可能还想考虑将 "Expression and Constraint" 用作 "Evaluation operation",因为如果没有它,无论 "Check stock" 成功还是失败,流程都会继续(除非那是期望的行为)。 "Constraint" 部分是 "Value" 字段所代表的 - 在您的图像中它设置为 Failure,但显示为灰色(由于仅选择了 "Expression")因此不活跃。

解决方案

您必须设置以下值:

拒绝订单

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]

截图

建议

我认为最好在您的程序中添加一个 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