2011-04-29 89 views
0

我在數據流任務中出錯。我有一個ado.net源去異步腳本組件。SSIS:從outputbuffer中刪除空行

問題就來了,在從腳本組件到目的地,它

試圖把空行它的輸出緩衝區會自動將我的表中插入的盡頭。

有沒有辦法來防止這種情況發生/我如何操作輸出緩衝區,以便我可以從中刪除特定的行?

回答

1

你說源代碼去了一個異步腳本組件。如果這是真的,那麼當行進入輸出緩衝區時,您已經在控制它。

默認情況下,腳本組件是同步的。每個輸入行都有一個輸出行。也許這是你目前設置的。

如果你想使用腳本組件作爲一個異步組件,你必須做到以下幾點:

  • 添加新的腳本組件的組件上
  • 右鍵單擊並選擇顯示高級編輯器。 ..
  • 在輸入和輸出屬性上,選擇輸出項並將SynchronousInputID值更改爲無。
  • 在輸出選項卡上,添加將定義輸出緩衝區的列。您必須定義列,因爲與同步腳本不同,輸出緩衝區不會自動定義爲與輸入緩衝區匹配。

當你編輯腳本,你可以使用OutputBuffer.AddRow方法在輸出緩衝器來創建新行。每次調用AddRow時,現有的緩衝區內容都將從腳本組件中發出,並在下一行中清除。使用您的規則來跳過行,您將在添加或跳過行之前驗證輸入緩衝區。

1

爲了解決這個問題,我添加了條件拆分組件,並在其中一個空白列(即len([testfield])> 0)上添加了長度檢查。然後,我將那些帶有支票的字段發送到數據庫,而對另一個分支沒有做任何事情。

0

問題似乎是SSIS在PreExecute期間執行AddRow()函數。然後這往往會與您在public override void ProcessInputRow()函數中使用AddRow()的任何衝突發生衝突。例如PreExecute會創建一個新行來消除事件,然後手動創建一個新行作爲處理的一部分,現在您有兩個新行,其中第一行充滿NULLS並已傳遞到outputbuffer。要解決這個問題,我會覆蓋CreateNewOutputRows(),並將其保留爲空,而不是隻根據需要添加行。如果正確的數據沒有顯示在輸入緩衝區中,我的一些異步腳本根本不會在輸出緩衝區中添加任何行。

public class ScriptMain : UserComponent { 

    public override void CreateNewOutputRows() {} 

    public override void Input_ProcessInputRow(InputBuffer Row) { 
     if(asNeeded) { 
      OutputBuffer.AddRow(); 
     } 
    } 
}