2017-10-05 84 views
0

我收到一个Unicode文本平面文件,其中一列是单个固定长度值,另一列包含由垂直管道'|'分隔的列表值。第二列的长度和它包含的分隔值的数量会有很大的不同。在某些情况下,该列最多可以包含50000个字符,并且可以包含千个或更多的分隔值。SSIS:如何将NTEXT输入转换为字符串以在脚本组件中执行拆分功能?

输入文件示例:

[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 

我可能会b做错了吗?

+1

未来版本的SQL Server中将删除'ntext','text'和'image'数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前正在使用它们的应用程序。改为使用'nvarchar(max)','varchar(max)'和'varbinary(max)'。 [请参阅此处](http://msdn.microsoft.com/en-us/library/ms187993.aspx) –

+0

数据的来源是一个文本文件。单独分隔的成员的最终目标将是一个varchar(256)列。但是,我需要一个数据类型用于文本处理。我选择了NTEXT,因为我不知道文本文件中列的宽度。 – osboy1

+0

@marc_s我想我应该澄清我对你的回应的评论。有关即将在SQL Server的未来版本中删除数据类型的信息通常具有丰富的内容和帮助。我应该问的是,哪些内部SSIS数据类型适合用于SSIS数据流组件,如果不是DT_TEXT和DT_NTEXT,则通过管道移动长文本数据? – osboy1

回答

0

下面的代码工作:

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中,但实际上只是路过一些对象元数据的字符串输出。此方法正确地分割我的成员并构建完整的行。

相关问题