2013-06-22 42 views
2

使用SSIS傳輸包含SQL的CSV文件。使用SSIS傳輸包含SQL(即潛在特殊字符)的CSV文件

我使用.NET創建一個CSV文件,然後使用SSIS包將其轉移到表中。

該文件的內容是一個36字符的GUID和任何可能包含製表符,管道字符和可能的任何類型的字符的SQL文本。我想我會指定我自己的列和行分隔符使用Windows CharMap附件實用程序來爲分隔符選擇不能輸入類型的字符。我分別選擇了1/4和1/2作爲列和行分隔符。

的測試文件,我創建看起來像這樣:

Guid¼Sql½3afc912b-917d-4719-8ded-22e5d95930a3¼SELECT 
* FROM 
TABLE½a867fa30-f2c7-459e-8985-9ef42616991e¼SELECT 
* FROM 
TABLE½ 

文件SSIS文件連接列定義爲

Guid: string [DT_STR] 36 
Sql: text stream [DT_TEXT] 

我將其傳送到下面的SQL Server目標表:

CREATE TABLE [dbo].[CodeObjectSql](
    [Guid] [char](36) NOT NULL, 
    [Sql] [varchar](max) NOT NULL 
) ON [PRIMARY] 

當我預覽文件時,列分隔符將顯示爲最後一個(第37個)ch guid第一列和行分隔符的字符顯示爲SQL列值的最後一個字符。

這是我的錯誤:

Error: 0xC02020A1 at Load CodeObjectSql, CodeObjectSql File [1]: Data conversion failed. The data conversion for column "Guid" returned status value 4 and status text "Text was truncated or one or more characters had no match in the target code page.". 
Error: 0xC020902A at Load CodeObjectSql, CodeObjectSql File [1]: The "output column "Guid" (10)" failed because truncation occurred, and the truncation row disposition on "output column "Guid" (10)" specifies failure on truncation. A truncation error occurred on the specified object of the specified component. 
Error: 0xC0202092 at Load CodeObjectSql, CodeObjectSql File [1]: An error occurred while processing file "C:\CodeObjectSql.csv" on data row 2. 
Error: 0xC0047038 at Load CodeObjectSql, SSIS.Pipeline: SSIS Error Code DTS_E_PRIMEOUTPUTFAILED. The PrimeOutput method on component "CodeObjectSql File" (1) returned error code 0xC0202092. The component returned a failure code when the pipeline engine called PrimeOutput(). The meaning of the failure code is defined by the component, but the error is fatal and the pipeline stopped executing. There may be error messages posted before this with more information about the failure. 

然後我試圖改變該文件以Unicode和修改的列類型它們的Unicode等效

Guid: string [DT_WSTR] 36 
Sql: text stream [DT_NTEXT] 

,仍然沒有運氣。

我的經驗是,SSIS無法在數據中使用文本限定符字符並在文本值中加倍特殊字符來處理數據中出現的行或列分隔符字符。

如果我的假設都基於我的測試是真實的,那麼這種類型數據使用的最佳格式是什麼?

嘗試創建此表並將數據粘貼到輸入文件中並親自查看。 :-)

回答

0

測試文件:全部在一行上。

Guid¼Sql½3afc912b-917d-4719-8ded-22e5d95930a3¼SELECT * FROM TABLE½a867fa30-f2c7-459e-8985-9ef42616991e¼SELECT * FROM TABLE½ 

平面文件源編輯配置:

Code Page: 1252 
Format: Delimited 
Text Qualifier: <none> 
Header row delimiter:{CR/LF} 
Header Rows to skip: 0 
Column names in the first data row: Checked 

現在去列:

Row delimiter: 1/2 
Column Delimiter: 1/4 

問題/建議:你能不能簡化您的分隔符?使用1/2和1/4是不尋常的。

另外:右鍵單擊數據源。轉到輸入和輸出屬性選項卡//輸出列// Guid。將字段屬性更改爲DT-STR(36)。

+0

你把所有的數據放在一行,但我正在尋找一個關於如何導入CSV文件的答案是數據是腳本存儲過程中的數據庫。腳本中可以包含CR \ LF字符,製表符,管道符和逗號。我選擇奇怪的派系角色作爲我的行和列分隔符的原因正是他們是不尋常的,而且不太可能發生在數據中!此外,我以前是我們的DT-STR(36),但是我得到了上面顯示的錯誤。那時我拼命嘗試unicode相當於無濟於事。 – ChadD

+0

ChadD - 一些評論:1.道歉,我沒有正確理解你的輸入文件格式,因此使用所有的一行格式。我將處理確切的格式並回復2.如果您正在創建源文件(而不是其他人發送它),那麼您將擁有更多的靈活性。你能不能利用這種靈活性來創建更加一致的輸出結果? Guid1/2Sql xxx1/2SQL1 xxx21/2SQL2? –

+0

ChadD - 我嘗試過,無法做到。我強烈地感覺到生成這個源文件的過程需要修改,以便輸出格式良好的CSV(字符分隔值)。你能發佈生成源文件的代碼嗎?我希望看到並學習您的解決方案。問候! –

0

Control Flow

代碼腳本任務:

public void Main() 
    { 
     FileStream fs1 = new FileStream(@"C:\Temp\half.txt", FileMode.Open, FileAccess.Read); 
     FileStream fs2 = new FileStream(@"c:\Temp\AllOnOne.txt", FileMode.Create); 

     BinaryReader r = new BinaryReader(fs1); 
     BinaryWriter w = new BinaryWriter(fs2); 

     // Read data 
     for (int i = 0; i < fs1.Length; i++) 
     { 
      byte b = r.ReadByte(); 

      if (!b.Equals(Convert.ToByte('\n')) && !b.Equals(Convert.ToByte('\r'))) 
      { 
       w.Write(b); 
      } 
     } 

     w.Close(); 
     r.Close(); 

     fs2.Close(); 
     fs1.Close();   

     Dts.TaskResult = (int)ScriptResults.Success; 
    } 

DFT - 從我以前的答案描述使用的設置。

half.txt的內容正是你在你的問題中提到的內容。請讓我們知道它爲你工作。如果您找到其他解決方案,請發佈。