【发布时间】: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
我可能做错了什么?
【问题讨论】:
-
ntext、text和image数据类型将在 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