2017-10-05 21 views
0

1つの列が単一の固定長値であり、もう1つが垂直パイプ '|'で区切られたリスト値を含むUnicodeテキストフラットファイルを受け取りました。 2番目の列の長さとそれに含まれる区切り値の数は大きく異なります。場合によっては、列の幅は最大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 

eが間違っている?

+1

'ntext'、 'text'、および' image'データ型は、将来のバージョンのSQL Serverでは削除されます。新しい開発作業でこれらのデータ型を使用しないようにし、現在使用しているアプリケーションを変更することを計画します。代わりに '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のと同じように、暗黙的な変換を実行しようとしていたが、実際には単なる文字列出力にいくつかのオブジェクト・メタデータを渡しました。このメソッドはメンバーを適切に分割し、完全な行を作成します。

関連する問題