SSIS 自定义列 属性

SSIS Custom Column Property

我有一个一般性问题,希望有人可以回答有关创建用于数据流组件的自定义属性的问题。

是否可以创建在列级别使用的自定义属性?我可以在组件级别创建自定义属性,没问题,但这对我没有好处。

我想向输入列元数据添加两个属性(加密和解密)。

假设我有一个输入列 col1、col2、col3 的集合。作为一名开发人员,我想将 col3 的 Encrypt 值设置为 true,这样,在 运行 时间,col3 在加载到数据库之前被加密。

我已经使用自定义组件成功加密和解密。尽管如此,我还是在 Description 列中使用了值“e”和“d”,然后在 PreExecute 期间评估了该 Description。我根据 Description 的值设置了一个状态对象,并将其添加到一个在 ProcessInput 期间处理的集合中。我不认为使用 Description 是一件好事,这就是自定义属性的需要。

SSIS 列是否具有自定义属性?

答案是肯定的。 SSIS 列是继承IDTSColumn130 接口的对象。如 SSIS documentation 中所述,此接口包含一个名为 CustomPropertyCollection 的 属性,其中包含组件添加到输入的 IDTSCustomProperty100 个对象的集合。

某些组件向 SSIS 列添加一些自定义 属性,例如 派生列转换 。据我所知,一个名为 FriendlyExpression 的自定义组件用于以纯文本形式存储表达式。但是,无法在 Integration Services 包设计器中添加自定义属性 (Visual Studio)。

如何添加自定义属性?

我认为唯一的方法是以编程方式创建包并编辑这些值,或者开发一个在运行时添加这些属性的自定义 SSIS 组件。

这是一个使用 C# 读取 派生列转换 的自定义属性的示例。 (Reference)

foreach (IDTSInputColumn localIColumn in localInput.InputColumnCollection)
{
    if (localIColumn.CustomPropertyCollection.Count == 2)
    {
        repository.AddAttribute(componentRepositoryID, localInput.Name + " [" + localIColumn.Name + "] [ID: " + localIColumn.ID.ToString() + "]", "From [" + localIColumn.UpstreamComponentName + "] " + FormatColumnDescription(localIColumn.Name, localIColumn.DataType, localIColumn.Length, localIColumn.Precision, localIColumn.Scale) + " Expression " +
            localIColumn.CustomPropertyCollection["FriendlyExpression"].Value != null ? localIColumn.CustomPropertyCollection["FriendlyExpression"].Value.ToString() : "Not Available"
            );
    }
    else
    {
        repository.AddAttribute(componentRepositoryID, localInput.Name + " [" + localIColumn.Name + "] [ID: " + localIColumn.ID.ToString() + "]", "From [" + localIColumn.UpstreamComponentName + "] " + FormatColumnDescription(localIColumn.Name, localIColumn.DataType, localIColumn.Length, localIColumn.Precision, localIColumn.Scale) + " Expression (See Ouput Column)");
    }
    //repository.AddObject(localIColumn.Name, "", ColumnEnumerator.ObjectTypes.Column, componentRepositoryID);
}

备选方案

您可以将列元数据存储在外部数据源中(SQL、XML、...)并在运行时加载它。或者您可以使用您在问题中提到的 Description 属性。