2012-06-26 26 views
3

我試圖在SSIS 2008中創建一個自定義腳本,它將循環選定的輸入列並將它們連接起來,以便它們可用於創建SHA1哈希。我知道可用的自定義組件,但我無法將它們安裝在我們的系統上。SSIS自定義腳本:在列上循環以連接值

雖然這裏提出的例子似乎工作正常http://www.sqlservercentral.com/articles/Integration+Services+(SSIS)/69766/當我測試了這個選擇只有少數,而不是所有列我得到奇怪的結果。如果選擇的列按順序排列,該腳本似乎只能工作。即使它們是有序的,在很多記錄或可能是下一個緩衝區之後,儘管在整個測試數據中行都完全相同,但會生成不同的MD5哈希值。

我試着去修改前面鏈接的代碼以及這些文章,但迄今爲止沒有任何喜悅。 http://msdn.microsoft.com/en-us/library/ms136020.aspx
http://agilebi.com/jwelch/2007/06/03/xml-transformations-part-2/

以此爲起點這工作正常顯示,我已經選擇了要用作輸入

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) 
    For Each inputColumn As IDTSInputColumn100 In Me.ComponentMetaData.InputCollection(0).InputColumnCollection 
     MsgBox(inputColumn.Name) 
    Next 
End Sub 

大廈這列名我嘗試使用下面的代碼來獲取值:

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) 
    Dim column As IDTSInputColumn100 
    Dim rowType As Type = Row.GetType() 
    Dim columnValue As PropertyInfo 
    Dim testString As String = "" 

    For Each column In Me.ComponentMetaData.InputCollection(0).InputColumnCollection 
     columnValue = rowType.GetProperty(column.Name) 
     testString += columnValue.GetValue(Row, Nothing).ToString() 
    Next 

    MsgBox(testString) 

End Sub 

不幸的是,這並不工作,我收到以下錯誤:

SSIS Error Message

我相信什麼,我試圖做的是容易實現的,雖然我有限的VB.net的,特別是在VB.net SSIS的知識,我掙扎。我可以單獨定義列名,如http://timlaqua.com/2012/02/slowly-changing-dimensions-with-md5-hashes-in-ssis/所示,但我想嘗試一種動態方法。

+0

幾乎所有NullReferenceException的情況都是一樣的。請參閱「[什麼是.NET中的NullReferenceException?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)」的一些提示。 –

回答

2

你的問題是試圖從你的數據庫的NULL值運行ToString()。

嘗試Convert.ToString(columnValue)來代替,它只是返回一個空字符串。

1

輸入列不保證每次都是相同的順序。因此,只要數據流中的元數據發生變化,您就會得到不同的散列值。編寫完全相同的腳本時,我經歷了同樣的痛苦。

網上的每一個答案我已經發現國家建立一個自定義組件能夠做到這一點。沒必要。每次打開腳本組件時,我都會依靠SSIS爲列名生成索引。需要注意的是,只要數據流的元數據發生變化,索引可能會發生變化,需要通過重新打開和關閉SSIS腳本組件來更新索引。

您將需要重寫ProcessInput()以獲得對PipelineBuffer的引用,該引用未在ProcessInputRow中公開,您實際上需要使用它來按索引而不是按名稱訪問列。

名稱和關聯索引列表存儲在ComponentMetaData.InputCollection [0] .InputColumnCollection中,每次需要迭代和排序以保證相同的HASH。

PS。我去年發佈了答案,但它消失了,可能是因爲它是用C#而不是VB(與SSIS無關)。你可以在這裏找到所有難看的細節代碼https://gist.github.com/danieljarolim/e89ff5b41b12383c60c7#file-ssis_sha1-cs

+0

您的答案已被刪除,但我不知道原因。你不能** [看到它?](http://stackoverflow.com/a/15778581/344949)** –