条件 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 True
或 False
.
如需了解更多信息,请关注此 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
我在 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 True
或 False
.
如需了解更多信息,请关注此 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