从foreach循环内部写入SSIS变量

时间:2015-01-16 09:51:09

标签: sql-server ssis sql-server-2012 ssis-2012

我在foreach循环中有一个脚本任务,应该写入变量。

Dts.Variables["Variable"].Value =  "Hello";

对我来说很好看,但变量似乎没有被写入。变量名称拼写正确,并在脚本任务配置中设置为ReadWrite。

变量具有包范围,是否存在与循环中可能影响它的相关内容?我也尝试过使用Dts.VariableDispencer。

更新: 我有一个我也写到的int,它写得很好。除了不同的数据类型,方法是相同的。任何想法,为什么我会写一个字符串?

2 个答案:

答案 0 :(得分:1)

使用此tutorial,您可以尝试通过创建两个方法来测试变量:一个用于读取变量,另一个用于写入变量。在尝试访问变量之前,必须先锁定变量。可以把它想象成SSIS的行锁定版本。您希望确保在该时间点获得最准确的变量版本。它有什么用处,因为事情可以并行运行,如果另一个任务是在您尝试读取它的同时更新变量?

public void Main()
{
    string myVar = ReadVariable("myVar");
    MessageBox.Show(myVar, "myVar");
    WriteVariable("Variable", "Hello");
    string yourVar = ReadVariable("Variable");
    MessageBox.Show(yourVar, "yourVar");
    Dts.TaskResult = ScriptResults.Success;
}

private object ReadVariable(string varName)
{
    object rtnValue = null;
    //Create a variables collection to hold you object
    Variables var = default(Variables);

    try {
        //Lock the variable first to make sure that you have exclusive access
        //Think of it like a database object lock
        Dts.VariableDispenser.LockOneForRead(varName, var);

        //Now populate your result
        rtnValue = var(varName).Value;
    } catch (Exception ex) {
        throw ex;
    } finally {
        //You must make sure that you unlock the variable before exiting routine
        var.Unlock();
    }

    return rtnValue;
}

private void WriteVariable(string varName, object value)
{
    //Create a variables collection to hold you object
    Variables var = default(Variables);

    try {
        //Lock the variable first to make sure that you have exclusive access
        //Think of it like a database object lock
        Dts.VariableDispenser.LockOneForWrite(varName, var);

        //Now populate your result
        var(varName).Value = value;
    } catch (Exception ex) {
        throw ex;
    } finally {
        //You must make sure that you unlock the variable before exiting routine
        var.Unlock();
    }

}

答案 1 :(得分:0)

事实证明变量实际上被设置为表达式(完全忘记了我已经完成了!)。这就是阻止它被覆盖的原因。将其更改为正常变量可以解决问题。