【问题标题】:SSIS: How can I convert an NTEXT input to a string to perform a Split function in a script component?SSIS:如何将 NTEXT 输入转换为字符串以在脚本组件中执行拆分功能?
【发布时间】:2017-10-05 00:17:56
【问题描述】:

我收到一个 Unicode 文本平面文件,其中一列是单个固定长度值,另一列包含由垂直管道“|”分隔的列表值。第二列的长度和它包含的分隔值的数量会有很大的不同。在某些情况下,该列的宽度最多为 50000 个字符,并且可能包含一千个或更多的分隔值。

输入文件示例:

[ObjectGUID]; [member]
{BD3481AF8-2CDG-42E2-BA93-73952AFB41F3}; CN=rGlynn SrechrshiresonIII,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}; CN=reeghler Johnson,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp|CN=rCoefler Cellins,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp|CN=rDasije M. Delmogeroo,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp|CN=rCurry T. Carrollton,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp|CN=yMica Macintosh,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp

我的想法是对该列执行拆分操作并为每个值创建一个新行。我正在尝试使用脚本组件来执行拆分。

分隔列的宽度很容易超过 DT-WSTR 的 4000 个字符的限制,所以我选择了 NTEXT 作为数据类型。这会出现问题,因为我熟悉的 .Split 方法需要一个字符串。我正在尝试将 NTEXT 转换为脚本组件中的字符串。

这是我的代码:

public override void Input0_ProcessInputRow(Input0Buffer Row)

{
var stringMember = Row.member.ToString();
    var groupMembers =  stringMember.Split('|');
foreach (var groupMember in groupMembers)
{
    this.Output0Buffer.AddRow();
    this.Output0Buffer.objectGUID = Row.objectGUID;
    this.Output0Buffer.member = groupMember;
}

}

我想要得到的输出是这样的:

[ObjectGUID]                                [member]
{BD3481AF8-2CDG-42E2-BA93-73952AFB41F3}     CN=rGlynn SrechrshiresonIII,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=reeghler Johnson,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=rCoefler Cellins,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=rDasije M. Delmogeroo,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=rCurry T. Carrollton,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}     CN=yMica Macintosh,OU=Users,OU=PRV,OU=LOL,DC=ent,DC=keke,DC=cqb,DC=corp

但实际上我得到的是:

[ObjectGUID]                               [member]
{BD3481AF8-2CDG-42E2-BA93-73952AFB41F3}    Microsoft.SqlServer.Dts.Pipeline.BlobColumn
{AC365A4F8-2CDG-42E2-BA33-73933AFB41F3}    Microsoft.SqlServer.Dts.Pipeline.BlobColumn

我可能做错了什么?

【问题讨论】:

  • ntexttextimage 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)varbinary(max)See details here
  • 数据的来源是一个文本文件。各个分隔成员的最终目的地将是 varchar(256) 列。但是,我需要一个用于文本处理的数据类型。我选择了NTEXT,因为我不知道文本文件中列的宽度。
  • @marc_s 我想我应该澄清我对您的回复的评论。您关于即将在 SQL Server 的未来版本中删除数据类型的信息通常会提供有用的信息。我应该问的是,如果不是 DT_TEXT 和 DT_NTEXT,哪种内部 SSIS 数据类型适合用于 SSIS 数据流组件,以通过管道移动长文本数据?

标签: ssis buffer tostring type-conversion script-component


【解决方案1】:

以下代码有效:

public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

            var blobLength = Convert.ToInt32(Row.member.Length);
            var blobData = Row.member.GetBlobData(0, blobLength);
            var stringData = System.Text.Encoding.Unicode.GetString(Row.member.GetBlobData(0, Convert.ToInt32(Row.member.Length)));
            var groupMembers = stringData.Split('|');
            foreach (var groupMember in groupMembers)
                {
                    this.Output0Buffer.AddRow();
                    this.Output0Buffer.CN = Row.CN;
                    this.Output0Buffer.ObjectGUID = Row.ObjectGUID;
                    this.Output0Buffer.member = groupMember;
            }
    }

我试图像在 PowerShell 中一样执行隐式转换,但实际上只是将一些对象元数据传递给字符串输出。此方法正确拆分我的成员并构建完整的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 2021-09-16
    • 2020-11-30
    • 2021-11-22
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    相关资源
    最近更新 更多