2017-08-16 110 views
0

我有一個輸入平面文件,每個輸出記錄有兩種類型的輸入記錄。第一條記錄(由第一欄C標識)有一個ID和人口統計信息。第二條記錄(由第一欄中的L標識)有一些財務信息。它們是管道分隔的,長度不同。數據流腳本組件中的SSIS設置變量

沒有辦法將所有C記錄寫入到一個流中,並且L記錄到另一個流中,然後將它們放回到一起。所以我的解決方案是進行條件分割。當我在SSIS變量中打開C記錄存儲所需的所有信息時。當我點擊一條L記錄時,可以從變量中派生列,並使用派生列和L記錄中的列來創建我的輸出記錄(也是平面文件)。

我已經瀏覽了整個互聯網,無法找到C#代碼來設置C記錄路徑的腳本組件中的變量。我想要的代碼看起來像有點像

Variable.User ::姓=第2列(從輸入文件) Variable.User ::姓=第3列(從輸入文件)

等。

有人可以幫我嗎?

感謝,

迪克

回答

1

這種想法是行不通的。當你處理每一行時,你認爲你可以用變量做什麼?任何對變量值做的事情都必須在填充它們的腳本中完成,因爲當你離開腳本時,變量將被下一行的值填充。

然而,治療學術你的問題,訪問一個腳本組件變量的方法已經提出並在這裏找到答案:How to access ssis package variables inside script component

這裏是我會怎麼處理這:

  1. 配置您的源組件,以便每一行都是單列
  2. 接下來做一個條件分割,將C行向下一個路徑發送,並將L行向下一個
  3. 在每個路徑中,使用派生列轉換或腳本轉換,將實際分隔符分割字符串,併爲該路徑中的記錄類型創建實際列。
  4. 繼續處理其餘的處理,直到它們到達各自的目的地。
0

我喜歡使用腳本組件:

第一步是添加的數據流。

在數據流添加腳本組件,並選擇源

在輸入/輸出: 添加您要爲您的輸出列信息。 (注意你將有2個獨立的輸出與許多列),並選擇你的數據類型。

現在進入腳本編輯器。

這裏是使用2個獨立的If語句

string strPath = ""; 
    var lines = System.IO.File.ReadAllLines(strPath); 

foreach (string line in lines) 
{ 
    if (line.Substring(1, 1) == "C") 
    { 
     char[] delim = "|".ToCharArray() ; 
     var C_cols = line.Split(delim); 
     Output0Buffer.AddRow(); 
     Output0Buffer.FirstName = C_cols[0]; 
     Output0Buffer.LastName = int.Parse(C_cols[1]); //Note that everything is a string until cast to correct data type 
     // Keep on going 
    } 

    if (line.Substring(1, 1) == "L") 
    { 
     char[] delim = "|".ToCharArray(); 
     var L_cols = line.Split(delim); 
     Output2Buffer.AddRow(); 
     Output2Buffer.FirstName = L_cols[0]; 
     Output2Buffer.LastName = int.Parse(L_cols[1]); 
     // Keep on going 
    } 
} 

此時腳本部件將具有兩個輸出端,可導致下不同的路徑的代碼。

0

感謝您的回覆。

因爲我需要C記錄和L記錄,所以我決定將整個輸入文件加載到SQL Server表中。一旦它在SQL中,我寫了一個非常簡單的存儲過程,通過表中的記錄遊標,當需要的列是C記錄時,將所需的列放入SQL變量,並將SQL變量和輸入數據中的數據插入輸出記錄當它是一個L記錄(我試圖完全在SSIS中做同樣的事情,但無法)。填充輸出記錄表後,編寫數據流以便將表輸出記錄中的所有記錄選擇爲數據流源並將它們作爲數據源目標放入所需的平面文件是一件簡單的事情。

迪克羅森堡