2

我正在 SSIS 中创建一个包,并希望将一个大列的文件转换为多列。

我有一个表,其中包含几行和一列原始数据。数据是从记事本文件中复制的,每一行都包含管道分隔符来分隔每一列,但是因为是记事本文件,所以每一行都被复制为一个大列。我想根据它们的开始/结束位置将每行的每一列转换为多列。

我尝试将 SSIS 派生列转换与SUBSTRING函数一起使用,但数据类型自动填充为text stream[DT_TEXT],并且出现以下错误:

[派生列[113]]出错;函数“SUBSTRING”不支持参数编号 1 的数据类型“DT_TEXT”。无法将参数的类型隐式转换为函数的兼容类型。要执行此操作,需要使用强制转换运算符显式强制转换操作数。

[派生列[113]]出错;评估函数“SUBSTRING”失败,错误代码为 0xC0047089。

[派生列[113]]出错;计算表达式“SUBSTRING[RawData],1,5)”失败,错误代码为 0xC00470C5。表达式可能有错误,例如除以零,在解析时无法检测到,或者可能存在内存不足错误。

[派生列[113]]出错;"Derived Column.Outputs[Derived Column Output].Coluns[Derived Column 1] 上的表达式 "SUBSTRING[RawData], 1,5)" 无效

[派生列[113]]出错;无法在“Derived Column.Outputs[Derived Column Output].Columns[Derived Column 1] 上设置属性“Expression”。

SUBSTRING当我查看使用包含单个列的文件的其他派生列转换插图时,我注意到数据类型显示为DT_WSTR.

我需要转换成这种数据类型吗?如果是这样,我如何在 SSIS 派生列转换中使用转换运算符显式转换DT_TEXT数据类型?DT_WSTR

否则,我还能如何处理这种转换?

Derived Column Name: EmployerNo
Derived Column:      Replace 'RawData'
Expression:          SUBSTRING( [RawData], 1, 5 )
Data Type:           text stream[DT_TEXT]

我希望 RawData 列根据它们的开始和结束位置被拆分(转换)为 8 个不同的列。

4

1 回答 1

0

参考 SUBSTRING (SSIS 表达式)文档

返回字符表达式中从指定位置开始并具有指定长度的部分。

您必须在使用函数之前将DT_TEXT列转换为DT_STR/ ,您可以使用脚本组件执行此操作,您可以使用类似的函数:DT_WSTRSubstring()

string BlobColumnToString(BlobColumn blobColumn)
{
    if (blobColumn.IsNull)
        return string.Empty;

    var blobLength = Convert.ToInt32(blobColumn.Length);
    var blobData = blobColumn.GetBlobData(0, blobLength);
    var stringData = Encoding.Unicode.GetString(blobData);

    return stringData;
}

或者,如果DT_TEXT长度不超过DT_STR长度限制,请尝试使用以下 SSIS 表达式:

SUBSTRING( (DT_STR,1252,4000)[RawData], 1, 5 )
于 2019-08-09T19:54:15.083 回答