【问题标题】:Conditional SSIS - execute one task or another based on the result条件 SSIS - 根据结果执行一项或另一项任务
【发布时间】:2018-01-15 14:27:36
【问题描述】:

我在 SSIS 中有以下任务:

在检查库存任务中,我执行了一个返回 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 设置为评估操作,然后从上一个任务中选择变量,无论哪种方式,它都不会转到应该执行的下一个任务。我错过了什么?我尝试了我在网上找到的东西,但没有任何帮助。谢谢!

【问题讨论】:

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


    【解决方案1】:

    解决方案

    您必须设置以下值:

    拒绝订单

    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
    

    【讨论】:

    • 感谢您的建议。关键是我的存储过程永远不会失败,如果失败,我不能设置优先约束来执行某个步骤。这种情况我该怎么办?
    • 这不会改变任何事情。即使总是成功
    【解决方案2】:

    尝试在表达式和约束中选择求值操作,表达式必须像@[User::Result] = 1。表达式必须返回 TrueFalse

    欲了解更多信息,请点击以下链接:

    【讨论】:

    • @[User::Result] == 1 不是 SSIS 表达式,你必须写 @[User::Result] = 1
    【解决方案3】:

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

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

    【讨论】:

    • 在提交的值上,我应该对两者都使用 Success 吗?
    • “查询库存”中的查询总是会成功。这种情况我该怎么办?
    • 是的,对两者都使用“Success” - 这实际上只是确保如果您遇到一些随机错误 - 有人更改了表名,类似的东西 - 该过程将停止并且您会收到错误消息等,并且该过程不会继续进行。所以是的,我会使用“成功”,然后是我发布的表达方式。
    • “成功”是默认值,您绘制的每个新约束都将具有该“值”。如果您仅使用“表达式”,箭头将保持绿色实际上令人困惑 - 它实际上应该是黑色的,表示“完成”,这意味着流程将继续进行(成功/失败)。
    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    相关资源
    最近更新 更多