3

SSIS 2008で、選択した入力列をループして連結し、SHA1ハッシュの作成に使用できるカスタムスクリプトを作成しようとしています。利用可能なカスタムコンポーネントを知っていますが、職場のシステムにインストールできません。

ここで紹介した例は正常に機能しているように見えますが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エラーメッセージ

VB.net、特にSSISのVB.netに関する知識は限られていますが、私がやろうとしていることは簡単に達成できると確信しています。動的な方法を試してみたいのですが、ここhttp://timlaqua.com/2012/02/slowly-changing-dimensions-with-md5-hashes-in-ssis/に示すように、列名を個別に定義できます。

4

2 に答える 2

2

問題は、データベースのNULL値に対してToString()を実行しようとしていることです。

代わりにConvert.ToString(columnValue)を試してください。空の文字列が返されるだけです。

于 2012-12-04T17:11:09.100 に答える
1

入力列が毎回同じ順序であるとは限りません。したがって、データフローのメタデータが変更されるたびに、別のハッシュを取得することになります。まったく同じスクリプトを書くとき、私は同じ苦痛を経験しました。

私が見つけたネット上のすべての答えは、これを行うことができるカスタムコンポーネントを構築することを述べています。必要なし。スクリプトコンポーネントを開くたびに基本クラスを構築するときに、SSISを使用して列名のインデックスを生成しました。注意点は、データフローのメタデータが変更されるたびに、インデックスが変更される可能性があり、SSISスクリプトコンポーネントを再度開いたり閉じたりして更新する必要があることです。

ProcessInputRowに公開されていないPipelineBufferへの参照を格納するには、ProcessInput()をオーバーライドする必要があります。実際には、名前ではなくインデックスで列にアクセスするために使用する必要があります。

名前と関連するインデックスのリストは、ComponentMetaData.InputCollection [0] .InputColumnCollectionに格納されます。これは、毎回同じHASHを保証するために、繰り返して並べ替える必要があります。

PS。昨年回答を投稿しましたが、おそらくVBではなくC#であったため(SSISでは無関係)、それは消えました。ここですべての醜い詳細を含むコードを見つけることができますhttps://gist.github.com/danieljarolim/e89ff5b41b12383c60c7#file-ssis_sha1-cs

于 2014-05-30T11:34:00.187 に答える