Sql-Server

無法將平面文件導入 SqlServer

  • February 21, 2019

我有這個製表符分隔的平面文件,有 50 列和 200 萬行。我正在嘗試將其導入 Sql Server 2017 Express。(我第一次嘗試在 Excel 中使用它……毫無希望。)

我看到兩個可用的導入路徑:SqlServer Management Studio 的導入平面文件命令,以及導入和導出數據嚮導。兩者都失敗了,但方式不同。

使用 SSMS,它似乎在解析文件和猜測列類型方面做得很好,但它僅基於前幾百行的長度。一列是長文本,所以我嘗試將其設置為 nvarchar(4000) 或 nvarchar(max) 或 ntext。我知道的其他一些可能比預設猜測的長度 50 長,所以我增加了尺寸。但是當我執行導入時,它說某些列將被截斷或以其他方式無法轉換,並且它拒絕說哪一列是有問題的

另一方面,使用導入嚮導,它根本不會猜測列類型,我必須手動設置我知道的那些。值得慶幸的是,它有一個設置,可以讓您按列告訴它是否因轉換錯誤而失敗或忽略它們。但它忽略了這個設置——無論你如何設置容差,每列或全域,它總是失敗。

好的部分是它確實確定了失敗的列名,即長文本列。但盡我所能衡量它,其中沒有任何應該失敗的東西。我認為任何值都不會超過 4000 個字元(我找到的最長的是 2027),而且我很確定字元集是純 ascii-7。事實上,它被強制全部大寫。

我還嘗試從我製作的失敗的 Excel 表中導入。這被阻止了,因為只有 32 位的導入器可以看到 Excel,而只有 64 位的導入器可以看到我的數據庫實例。

我怎樣才能獲得其中一個或另一個以允許導入完成?

我之前使用過 tsv 文件並且遇到了類似的問題。當您導入平面文件時,我建議您更改 SQL Server 解釋列的方式 https://user-images.githubusercontent.com/35179176/34650736-39eaaab0-f3c6-11e7-9706-377c5f0f1170.png ↑更改它到

$$ DT_TEXT $$(非 unicode)或$$ DT_WSTR $$(對於 Unicode)。為了能夠改變這一點,您必須通過“導入數據”而不是“導入平面文件”選項進行導入。

您可以不使用導入嚮導,而是將 TSV 文件放在 SQL Server 上並使用 OPENROWSET 直接使用 T-SQL 腳本讀取文件數據。使用此方法和 SELECT … INTO 將允許您根據文件中的實際數據類型(最大列等)創建一個表。

有關更多資訊,請參閱此連結

基本語法:

SELECT BulkColumn
FROM OPENROWSET (BULK 'c:\temp\mytxtfile.txt', SINGLE_CLOB) MyFile 

查看文件以處理諸如行終止符等

引用自:https://dba.stackexchange.com/questions/229989