以编程方式评估表达式

bil*_*nkc 6 ssis

基本问题

有没有一种方法可以用来评估SSIS中的表达式?

背景故事

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

带表达式的变量

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

评估表达

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

为什么这是个问题

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

复制代码

/// <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);
}
Run Code Online (Sandbox Code Playgroud)

bil*_*nkc 5

解析度

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

  1. 分配实际表达式.
  2. 我忽视的是设置EvaluateAsExpression = true.这些工具现在可以自动设置该标志.

修改后的代码很简单

//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;
Run Code Online (Sandbox Code Playgroud)