SSIS派生列问题

Posted

技术标签:

【中文标题】SSIS派生列问题【英文标题】:SSIS Derived Column Issue 【发布时间】:2021-07-02 16:32:19 【问题描述】:

我在临时表的列中有一些数据,需要在目标表上拆分为多个列,但在使用派生转换时我不断收到错误消息。数据是这样的;

1 - xxx,xxxx,xxx,xxxxx,xxx
2 - xxxxx,xxxx,xxxx,xxxxxx

从 OLEDB 源中,我添加了一个派生列并将其命名并添加为新列,然后我尝试添加一个表达式 SUBSTRING( [column] , 1, FINDSTRING( [column] , ",",1 )-1 ) 我不断收到错误消息;

Error at Load Stg data into Table [SSIS.Pipeline]: The "Derived Column.Outputs[Derived Column Output].Columns[Insurer]" has a length that is not valid. The length must be between 0 and 4000.

Error at Load Stg data into Table [Derived Column [207]]: Failed to set the type of Derived Column.Outputs[Derived Column Output].Columns[Insurer] to type: "DT_WSTR", length: 6000, precision: 0, scale: 0, codepage: 0.

Error at Load Stg data into Table [Derived Column [207]]: Failed to set property "Expression" on "Derived Column.Outputs[Derived Column Output].Columns[Insurer]".



------------------------------
ADDITIONAL INFORMATION:

Exception from HRESULT: 0xC0204006 (Microsoft.SqlServer.DTSPipelineWrap)

我尝试使用高级编辑器更改列长度、数据类型,但仍然出现错误。 每行数据都有不同的长度,所以我不能硬编码列中数据的每个部分的长度。我正在使用 VS 2017。

【问题讨论】:

【参考方案1】:

这里有什么问题?

根据设置,派生列任务能够正确推断初始长度和类型 DT_WSTR 26。

但是,您提供的错误消息表明您的数据不符合预期

DT_WSTR",长度:6000

SSIS 中的字符串最大长度为 4000 个字符。如果需要在数据流中多出一个字符串,会带入流/大对象类型(DT_NTEXT)

您提供的内容有效,因此问题出在您的实际数据中。

来源

将样本数据注入流的简单查询。

SELECT
*
FROM
(
    VALUES
        ('1 - xxx,xxxx,xxx,xxxxx,xxx')
    ,   ('2 - xxxxx,xxxx,xxxx,xxxxxx')
)D(mycolumn)

DER 先拆分

提供的表达式(在步骤 1 中将 column 重命名为 mycolumn

SUBSTRING(mycolumn,1,FINDSTRING(mycolumn,",",1) - 1)

结果

从开始到第一个逗号的数据,不包括右端点

【讨论】:

所以表中的数据长度可能是这里的问题? 这将是我基于错误消息的假设以及简化示例显示您具有切碎字符串的正确语法的事实。如果截断是可以接受的,你可以取正确的 4000 个字符RIGHT(SUBSTRING(mycolumn,1,FINDSTRING(mycolumn,",",1) - 1), 4000)

以上是关于SSIS派生列问题的主要内容,如果未能解决你的问题,请参考以下文章

在 SSIS 派生列中替换 NULL

使用 SSIS 派生列提取日期值

无法解析我的 SSIS 派生列表达式

在 SSIS 派生列中将字符串转换为日期

SQL SSIS 使用派生列转换来处理空数据.. 替代方案?

为啥派生列组件的表达式不适用于 SSIS 中的空值?