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-changeing-dimensions-with-md5-hashes-in-ssis/虽然我想尝试一种动态方法。

4

2 回答 2

2

您的问题是尝试对数据库中的 NULL 值运行 ToString()。

尝试 Convert.ToString(columnValue) 代替,它只返回一个空字符串。

于 2012-12-04T17:11:09.100 回答
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

于 2014-05-30T11:34:00.187 回答