【问题标题】:SSIS Custom Column PropertySSIS 自定义列属性
【发布时间】:2022-01-17 21:27:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我编辑了我的答案。请检查一下

标签: sql-server ssis properties components etl


【解决方案1】:

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 属性。

【讨论】:

  • 感谢@Hadi 的回答。不完全是我所希望的,但答案就是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2011-03-14
相关资源
最近更新 更多