SSIS 控制流:优先约束未按预期工作

kry*_*tah 8 sql-server ssis ssdt

我的 SSIS 包的控制流未按预期运行。

我想要实现的目标

  1. 测试是否在 SQL Server 上启用了 CLR 使用

    SELECT value
    FROM   sys.configurations
    WHERE  name = 'clr enabled'
    
    Run Code Online (Sandbox Code Playgroud)

  2. 如果value == 0,尝试启用 CLR 并显示消息Server is configured.
  3. 如果value == 1, 显示消息Server is configured.

如果我将控制流设置为仅执行一项或多项操作,则它可以工作。 在此处输入图片说明

此流程按预期工作。但是,我想,如果value == 0,在 之后继续 MessageBox Enable CLR on Server


我尝试将控制流更改为此 在此处输入图片说明

现在,发生的事情是这样的:

  • value == 0 [CLR Enabled on Server] 将控制交给 [Enable CLR on Server],完成并退出。
  • value == 1 [CLR Enabled on Server] 完成并退出。

[MessageBox- 服务器已配置] 永远不会到达。

任何人都可以帮助我理解这一点,和/或向我指出有关 SSIS 条件控制流的好资源吗?

bil*_*nkc 11

您的先例约束默认为一种AND情况。前面的任务必须返回成功并且表达式必须为真。

在这样的二进制场景中,这两个任务中只有一个会发生。通过添加约束下一级的-都依赖于消息框步,最后一步就是等待“启用CLR上服务器”是成功的,以及“CLR服务器上启用”是成功的,并value要等于0。

由于只有其中一种情况会奏效,因此您需要将 PC 摆到 OR 状态

在此处输入图片说明

这导致绿色虚线而不是实线

在此处输入图片说明

作为仅供参考,在您的脚本任务中,假设它以自动方式(SQL 代理)运行,因为您使用的是消息框,它会失败。有一个系统级变量,System::InteractiveMode它是一个布尔值。它指示您是否在可以与桌面交互的环境中运行。如果评估结果为 false 并且您尝试任何 GUI 活动,则程序包将出错。

我发现添加如下代码很有帮助

public void Main()
{
    // TODO: Add your code here
    bool interactiveMode = (bool) this.Dts.Variables["System::InteractiveMode"].Value;
    bool fireAgain = false;
    string message = "This is some message I likely built out using other SSIS Variable values";

    if (interactiveMode)
    {
        MessageBox.Show(message);
    }

    this.Dts.Events.FireInformation(0, "CLR Check", message, string.Empty, 0, ref fireAgain);

    Dts.TaskResult = (int)ScriptResults.Success;
}
Run Code Online (Sandbox Code Playgroud)

在那里,我检查了我的交互模式,并且只在可能的情况下尝试显示某些内容。我还继续触发 OnInformation 事件,因为它会自动登录到 2012+ 项目部署模型中,显示在 Visual Studio/SSDT/BIDS 的 GUI 和输出面板中,并且可以通过将 I 附加到 DTEXEC.exe 调用中轻松记录报告参数 /rep EI