【问题标题】:SSIS : Conversion text stream DT_TEXT to DT_WSTRSSIS:将文本流 DT_TEXT 转换为 DT_WSTR
【发布时间】:2019-08-09 17:28:13
【问题描述】:

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

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

我尝试使用带有 SUBSTRING 函数的 SSIS 派生列转换,但数据类型自动填充为 text stream[DT_TEXT],我收到以下错误:

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

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

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

[派生列[113]]出错;表达方式 “派生列。输出 [派生列”上的“SUBSTRING [RawData],1,5)” 输出].Coluns[Derived Column 1] 无效

[派生列[113]]出错;设置属性失败 “派生列”上的“表达式”。输出[派生列 输出].Columns[派生列 1]。 "

当我查看其他使用 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 个不同的列。

【问题讨论】:

    标签: sql-server ssis etl derived-column


    【解决方案1】:

    参考SUBSTRING (SSIS Expression) documentation

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

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

    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 )
    

    【讨论】:

    • 感谢您的回复,哈迪。我将在周一上班时尝试两种建议的解决方案,并让您知道我的结果。只是关于第一个解决方案的问题。我将在哪里插入“string BlobColumnToString(BlobColumn blobColumn)”表达式,我需要包含一个脚本任务,这是 C# 编码吗?
    • 你必须在脚本组件中定义这个函数并使用它:Row.StrColumn = BlobColumnToString(Row. BlobColumn) ;
    • 嗨哈迪,我尝试使用您建议的解决方案:SUBSTRING( (DT_STR,1252,4000) [RawData], 1, 5 ) 但遇到了第一篇文章中提到的类似错误以及错误0xC00470AA 的代码。然后我将其替换为: SUBSTRING( (DT_WSTR,1252,4000) [RawData], 1, 5 ) 并仍然收到类似的错误消息,除了第二条错误消息没有给我错误代码。另外,我不太明白将以下语句与脚本组件放在哪里: Row.StrColumn = BlobColumnToString(Row. BlobColumn) ;还有,什么是blockLength、blobColumn、blobData和stringData?
    • @SoniaScott 尝试使用数据转换转换转换为 dt_wstr 然后添加派生列以提取 Substring 。我认为它应该工作
    • 嗨 Hadi,我在上一个转换步骤中转换为 DT-STR,并且成功地能够在派生列步骤中使用 SUBSTRING 使用以下语句创建数据类型为 DT_WSTR 的多个列:SUBSTRING ([原始数据的副本],1,5)。但我还有另一个问题。该文件是可变长度的,由管道“|”分隔分隔符。是否可以使用派生列转换来分隔每一列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2015-04-11
    • 2016-06-17
    相关资源
    最近更新 更多