2017-10-12 85 views
0

我想知道是否有更新數據流任務中的列的方法,通過在每一行上運行select?SSIS更新列的結果是sql select

這裏的情況:

enter image description here

讓我們把這個作爲我們的起始位置。我從2個文件收集信息,然後合併它們,然後使用派生列工具添加一列。有沒有辦法通過使用行的值在每一行上執行選擇來填充此列?

例:

SELECT Count(*) AS cnt 
FROM TABLE T 
WHERE T.COLUMN1 = ROW.COLUMN3 
AND T.COLUMN2 = ROW.COLUMN5 

我不知道,如果我只是不正確措辭我的需要,但我不能得到任何結果

謝謝

回答

1

你應該能夠使用查找轉換來完成此操作。

編輯基於評論:

如果你不想使用查找由於表的大小,你可以做的正是你想用一個腳本組件是什麼。您可以爲數據流的每一行創建和執行SQL命令,就像在任何.net應用程序中一樣。

+0

我無法做到這一點,因爲查詢隨着每一行而改變,我不想加載完整的表格,因爲它很大。但是,如果可能的話,我有興趣看到如何 –

+0

謝謝,這就是我最終做的。我列出了我已發佈的解決方案中的步驟 –

1

我能夠用腳本組件做

1 - 我已經刪除了派生列

enter image description here

2 - 我已經創建了一個字符串變量來存放各種查詢用通配符字符串替換我需要從該行獲取的每個值。

3-我已經通過了這個變量與含有connecection串信息,以腳本組件

4-我添加一個新列的腳本組件

enter image description here輸出列一個allong

5-增補using System.Data.OleDb;

6-創建2個變量:

string jourFerieQuery; 
string dbcsoledbschema; 

7更新了PostExecute()把我的SSIS變量的值到腳本變量:

public override void PostExecute() 
    { 
     base.PostExecute(); 
     jourFerieQuery = Variables.jourFerieQuery; 
     dbcsoledbschema = Variables.dbcsoledbschema; 
    } 

8新增了一個方法:

int GetData(string cs, string query) 
    { 
     OleDbConnection conn = new OleDbConnection(cs); 
     conn.Open(); 
     OleDbCommand cmd = new OleDbCommand(query, conn); 

     DataTable dt = new DataTable(); 
     dt.Load(cmd.ExecuteReader()); 
     conn.Close(); 
     return (int)dt.Rows[0][0]; 
    } 

9-更新了Input0_ProcessInputRow( Input0Buffer行):

public override void Input0_ProcessInputRow(Input0Buffer Row) 
    { 
     string query = jourFerieQuery.Replace("[1]", Row.CODDEVI).Replace("[2]", Row.DATCRBEZEROCONGE.ToString()); 
     Row.Keep = GetData(dbcsoledbschema, query); 
    } 

我的查詢返回的計數,這就是爲什麼我添加的方法返回一個int

+0

看起來您已詳細瞭解我的答案!做得好。 – KeithL

+0

它總是有助於獲得細節 –

1

您可以通過腳本組件(轉換)來實現。

添加Ct的輸出。

我使用System.Data.OleDB,因爲它與SSIS包連接字符串相匹配。