2011-08-23 48 views
0

我在SQLServer 2008 R2上的SSIS中有一個腳本組件,需要能夠寫入一個讀寫變量來爲平面文件導出生成一個文件名。我創建了一個包級別變量來保存文件名,並將平面文件連接設置爲使用包含變量的表達式。SSIS腳本組件無法寫入到ReadWriteVariable

我有一個腳本組件,除了別的以外,它在文章中動態構建文件名執行方法。我已經在腳本組件的ReadWriteVariables設置中設置了變量。

如果我在變量中沒有默認值,則包會立即失敗,因爲平面文件連接管理器嘗試評估表達式以設置目標文件。所以,我只是把一個佔位符文件名。

問題是現在它總是使用佔位符文件名而不是腳本指定的文件名。確保我可以寫入這些變量的最佳方法是什麼?我試過Variables.VariableName =「value」,我也嘗試使用VariableDispenser和this.ReadWriteVariables [「VariableName」] .value,並且它們都不會持久保存我在腳本中設置的值。

+0

是什麼在你的包事件的順序?我假設這不是一個腳本組件,而是一個腳本任務(在控制流程中),您執行此名稱解析。是對的嗎? –

回答

0

以下是您可以從Data Flow Task內的Script Component中爲包變量賦值的一種方法。

我嘗試鎖定Script TaskScript Component中的變量,而不是在屬性對話框中指定它們。我覺得這很容易維護。

在以下示例中,我有一個名爲文件名包變量和變量與所述腳本組件內的值分配C:\Temp\PathChanged

我相信,腳本組件可能不是正確的位置來操縱包變量值,如文件名,但又取決於您正在嘗試做什麼。

希望有所幫助。

/* Microsoft SQL Server Integration Services Script Component 
* Write scripts using Microsoft Visual C# 2008. 
* ScriptMain is the entry point class of the script.*/ 

using System; 
using System.Data; 
using Microsoft.SqlServer.Dts.Pipeline.Wrapper; 
using Microsoft.SqlServer.Dts.Runtime.Wrapper; 

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] 
public class ScriptMain : UserComponent 
{ 
    public override void PreExecute() 
    { 
     base.PreExecute(); 
    } 

    public override void PostExecute() 
    { 
     base.PostExecute(); 

     IDTSVariables100 varCollection = null; 
     this.VariableDispenser.LockForWrite("User::FileName"); 
     this.VariableDispenser.GetVariables(out varCollection); 

     varCollection["User::FileName"].Value = @"C:\Temp\PathChanged"; 
    } 

    public override void Input0_ProcessInputRow(Input0Buffer Row) 
    { 
    } 
} 

Script Component

+0

這是正確答案的關鍵在於它不會顯示腳本組件可以寫入這些變量。一旦我將腳本移動到腳本任務中的控制流程中,它就全部開始工作。 – kettch