2011-04-26 70 views
1

將數據發送給我,轉換爲管道分隔文件。我試圖插入超過46000行,但四(4)的這些失敗,該錯誤消息是否有強制將截斷列插入SQL Server表的方法?

SQLSTATE = 22001,NativeError = 0 錯誤= [微軟] [SQL本機客戶端]字符串數據,右截斷

這將是很高興知道哪些行失敗。有沒有辦法強制這些行插入截斷的字符串,或確定哪些與BCP失敗?

  1. 我試圖構建在XLSX的的 插入語句文件 與CONCATENATE。這是因爲 我有太多的參數 CONCANTENATE。
  2. 我嘗試過逗號和 製表符分隔的文件,其失敗 ,因爲某些數據具有那些 個字符。
  3. 我終於建造管道分隔 文件更改 本地化設置,所以我可以做這個 用Excel(How to save an Excel spreadsheet as pipe-delimited),然後將它們導入表bcp TableName in MyCreatedCSVFile.csv -T -c -t^| <後 - 我不得不逃離|字符與命令行中的^。

有沒有更好的方式來做到這一點?

回答

1

您在使用臨時表嗎?

你通常使用一個慷慨的列長度等,然後進行驗證和質量檢查。即使是一個簡單的

INSERT Finaltable (..) 
SELECT (..), LEFT (offendingcolumn, 100) FROM Stagingtable 

一個存儲過程也可以用來做一個大量插入,然後一些檢查,然後插入到最終表中。

+0

太棒了。謝謝。 – Blanthor 2011-04-26 18:47:05

0

您可以設置得足夠高,以覆蓋異常錯誤的號碼,然後指定一個錯誤文件。然後,您一次處理一個例外情況。這是最乾淨的方法。如果你願意使用SSIS,你可以在你的工作流程中更加細緻地處理截斷和可能的日誌記錄,但是你失去了批量複製的好處。

0

我設法通過創建一個「而不是」觸發器來做到這一點。

我創建了VARCHAR(最大值)的表,以確保我沒有得到截斷。 然後我在插入上創建了一個替代觸發器(所以這個'代理'表永遠不會得到行)。

在觸發我做了轉換(VARCHAR(50),name255)。 即:明確地進行截斷。

然而,這意味着你需要指定「FIRE_TRIGGER」與您的BCP命令。

這是如何幫助。

相關問題