以编程方式评估表达式

时间:2013-04-10 15:40:22

标签: ssis

基本问题

我是否缺少一种方法来评估SSIS中的表达式?

背景故事

我正在以编程方式修复大量软件包,使其符合我们的标准。以最简单的形式,假设我正在创建新的variable并在其上分配expression。这很好用。

variable with expression

如果我单击省略号然后在出现的对话框窗口中单击“评估表达式”,我会看到我的公式求值在语法上是正确的,逻辑上它正在生成我期望的值。 评估是如何进行的?

Evaluate Expression

当我在上一步中单击“确定”时,请注意对我变量的.Value的更改。它现在填充了表达式的评估版本。我需要在我的代码中模拟相同的步骤,但我不知道它在BIDS / SSDT中是如何做到的。从概念上讲,它只是variable.Value = MAGIC;,但我失败了巫师101。

为什么这是一个问题

我正在进行的实际工作比这复杂得多。我正在添加和配置多个任务以及数据流。其中一个步骤是添加一个执行SQL任务,该任务使用一个分配了表达式的变量(表中的表格)来核实表中的现有数据。包的运行时似乎没有评估实际的表达式......这导致我发现了我的问题。

复制代码

/// <summary>
/// Create a simple package with a variable that has an expression to figure
/// out how to evaulate the resulting value.
/// </summary>
static void ExpressionPOC()
{
    Microsoft.SqlServer.Dts.Runtime.Package p = new Microsoft.SqlServer.Dts.Runtime.Package();
    Microsoft.SqlServer.Dts.Runtime.Application app = new Microsoft.SqlServer.Dts.Runtime.Application();
    p.Name = "ProofOfConcept";
    Microsoft.SqlServer.Dts.Runtime.Variable v = null;
    // This creates a simple variable of type string with an initial value of blank string
    v = p.Variables.Add("ContrivedExample", false, "User", string.Empty);
    v.Expression = @"""My package is named "" + @[System::PackageName]";
    // Looking for something here to 
    //v.Value = v.Expression.EvaluatePrettyPlease();
    app.SaveToXml(@"C:\Users\bfellows\Documents\Visual Studio 2012\Projects\Demo\Demo\testVariable.dtsx", p, null);
}

1 个答案:

答案 0 :(得分:5)

分辨率

由于我已经写过这个问题,我将发布它以期拯救别人的麻烦。在SQL Server 2012之前,或者如果使用BIDSHelper来创建表达式,则使用带表达式的变量有 2 步骤。

  1. 指定实际表达式。
  2. 我忽略的是设置EvaluateAsExpression = true。这些工具现在可以自动设置该标志。
  3. 修改后的代码只是

    //v.Value = v.Expression.EvaluatePrettyPlease();
    // The missing EvaluatePrettyPlease method is the property EvaluateAsExpression
    // By setting this property, the expressions actually evaluate
    // go figure
    v.EvaluateAsExpression = true;