根据输入参数具有输出列数量的数据流组件.SSIS自定义数据流组件

本文关键字:数据流 组件 自定义 SSIS 输入 参数 输出 | 更新日期: 2023-09-27 18:13:42

我正在开发一个自定义数据流组件。我定义的一个自定义属性包含一个字符串,该字符串包含有关输出列数的信息,准确地说,它包含列的名称(可以是4,可以是5,也可以是50)。

因此,输出列的数量是可变的。我不知道如何(或者即使它是可能的)有一个组件的输出列的数量根据输入而变化。

有人知道怎么处理吗?由于

Ok。因此,在设计时,我会查看自定义属性并创建所需的列。我应该用哪种方法做这件事?

我尝试了这个在ProvideComponentProperties:

    this.fields_ = this.ComponentMetaData.CustomPropertyCollection["Fields"].Value.ToString().Split(new Char[] { ',' });
    foreach (string _field in fields_)
    {
        IDTSOutputColumn100 _outputCol = ComponentMetaData.OutputCollection[0].OutputColumnCollection.New();
        _outputCol.Name = _field;
        _outputCol.SetDataTypeProperties(DataType.DT_STR, 20, 0, 0, 1252);
    }

基本上fields_拆分了一个字符串,像这样:

PRVT_PLACE,OPT_IMPLIED_VOLATILITY_MID,OPT_IMPLIED_VOLATILITY_YEST

对于每个字段,我想创建一个输出列。

然后我放下我的组件并设置fields_属性,但我得到以下消息:

The name for "output column" "(93)" is blank and names cannot contain blanks.

在上面的例子中,只有一个列的名称是空的,而不是4个…

我做错了什么?

根据输入参数具有输出列数量的数据流组件.SSIS自定义数据流组件

SSIS要求元数据不能在运行时更改。这意味着您可以在设计期间随心所欲地使用元数据,但是一旦包执行:源、目标(外部元数据:db、file等)和管道元数据就不能更改。它是一种安全机制,以确保包将按预期工作。

当然,元数据中的一些更改只会导致警告。例如,oledb destination会注意到列数据类型从DT_I2到DT_I4的变化(在SQL Server中是smallint -> int),但它会正常工作。其他一些组件,如SQL Server destination不允许对元数据进行任何更改。

摘要:可以创建自定义组件,在设计时更改输出列的数量,但不可能在运行时更改列的数量或更改列的类型。

我终于找到了解决办法。这可能不是我要做的事,但它符合我的需要。

我重写了OnOutputPathAttached方法。在这个方法中,我查看我的fields_属性并根据它们的编号添加列。
ComponentMetaData.OutputCollection[0].OutputColumnCollection.RemoveAll();
string[] fields = this.ComponentMetaData.CustomPropertyCollection["Fields"].Value.ToString().Split(new Char[] { ',' });
foreach (string _field in fields)
{
     IDTSOutputColumn100 _outputCol = ComponentMetaData.OutputCollection[0].OutputColumnCollection.New();
     _outputCol.Name = _field;
     _outputCol.SetDataTypeProperties(DataType.DT_STR, 20, 0, 0, 1252);
}
base.OnOutputPathAttached(outputID);

当然您应该通过重写ReinitializeMetaData()来做到这一点。只有在支持不同数量的输出列(可能每个列上有不同的输出列)时,才需要执行OnOutputPathAttached。

我认为

见http://technet.microsoft.com/en-us/library/ms135954.aspx