2017-10-05 85 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中,但實際上只是路過一些對象元數據的字符串輸出。此方法正確地分割我的成員並構建完整的行。

相關問題