2016-11-28 44 views
1

我有一個平面文件女巫我想批量插入SQL服務器(2016年)。批量插入平UTF-8與áåóñ

BULK INSERT table FROM 'path\flatfile.dat' 
    WITH 
     (
     FORMATFILE='path\fileformat.fmt', 
     CODEPAGE = '65001', 
     DATAFILETYPE = 'Char' 
    ); 

平面文件沒有字段終止:我有一個類似的格式

     9999030000000001001ab Baujahr             0 
         9999030000000001004from construction year          0 
         9999030000000001006à partir d'année de construction       0 
         9999030000000001007da anno              0 
         9999030000000001008año construcción desde          0 
         9999030000000001009Vanaf bouwjaar            0 
         9999030000000001010fra byggeår             0 
         9999030000000001011från årsmodell            0 
         9999030000000001012fra årsmodell            0 
         9999030000000001013Vuosimallista            0 

但在格式文件我設置字段的lenght

12.0 
    7 
    1  SQLCHAR   0  22  ""   1  Field1   "" 
    2  SQLCHAR   0  4  ""   2  field2   "" 
    3  SQLCHAR   0  3  ""   3  field3   "" 
    4  SQLCHAR   0  9  ""   4  field4   "" 
    5  SQLCHAR   0  3  ""   5  field    "" 
    6  SQLCHAR   0  60  ""   6  Textfield   "" 
    7  SQLCHAR   0  1  "\r\n"  7  flag    "" 

其他文件除了這個偉大工程一。 我得到的錯誤是行截斷包含caracters AAON ...

Msg 4863, Level 16, State 1, Line 6 
Bulk load data conversion error (truncation) for row 3, column 7 (LFlag). 
Msg 4863, Level 16, State 1, Line 6 
Bulk load data conversion error (truncation) for row 5, column 7 (LFlag). 
Msg 4863, Level 16, State 1, Line 6 
Bulk load data conversion error (truncation) for row 7, column 7 (LFlag). 
Msg 4863, Level 16, State 1, Line 6 

什麼想法?

+0

哪些列在目標表中的數據類型? –

+0

數據類型是nvarchar,長度與fmt文件中的長度相同(Field1 [nvarchar](22))... – user2151863

+0

未經測試,但您可能需要使用'SQLNCHAR'而不是'SQLCHAR'作爲每個列的數據類型格式文件(https://msdn.microsoft.com/en-us/library/ms189110.aspx) –

回答

0

使用UTF-8處理BCP格式文件的使用是否完全支持尚不清楚 - 您的經驗表明它不是。 導入UTF-8文件時,字節計數和字符計數之間似乎存在一些混淆。我認爲這可能是BCP中的一個錯誤。

具有以下測試表

USE tempdb 
GO 
CREATE table t1 
(f1 nvarchar(max), 
f2 nvarchar(max), 
f3 nvarchar(max), 
f4 nvarchar(max), 
f5 nvarchar(max), 
f6 nvarchar(max), 
f7 nvarchar(max)) 

我能夠導入使用中的問題格式文件的文件,並同BULK INSERT命令。

然而,有什麼值得注意的是,最後一列(f7在我的表)左側填充數量等於在列中的數字雙字節字符的前導空格6.

在第3行(列6值à partir d'année de construction),第7列用兩個空格填充。第5行和第8行也是如此,它們也有兩個雙字節字符。

在第9行(第6列值fra årsmodell)中,列7填充了一個空格。第7行也是如此。

看起來像字節計數和字符計數沒有被BCP正確跟蹤。

假設你的輸入文件的格式是固定的,唯一的選擇,我可以看到,以解決此問題是將數據文件導入到單nvarchar(max)列的表,然後用LEFTRIGHTSUBSTRING聲明提取從行的數據值:

CREATE TABLE t2 
(f1 nvarchar(max)) 

BULK INSERT t2 FROM 'file\location' WITH (CODEPAGE = '65001',DATAFILETYPE = 'Char'); 

SELECT LEFT(f1,22), SUBSTRING(f1,23,4), SUBSTRING(f1,27,3), 
     SUBSTRING(f1,30,9), SUBSTRING(f1,39,3), SUBSTRING(f1,42,60), 
     SUBSTRING(f1,102,1) 
FROM t2 

編輯

測試的XML格式的文件,它不能正常工作,要麼。儘管使用XML格式的文件可以使文件無錯地加載,但列7的值會丟失並被空格替換。

格式文件:

<?xml version="1.0"?> 
<BCPFORMAT 
     xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RECORD> 
    <FIELD ID="1" xsi:type="CharFixed" LENGTH="22"/> 
    <FIELD ID="2" xsi:type="CharFixed" LENGTH="4"/> 
    <FIELD ID="3" xsi:type="CharFixed" LENGTH="3"/> 
    <FIELD ID="4" xsi:type="CharFixed" LENGTH="9"/> 
    <FIELD ID="5" xsi:type="CharFixed" LENGTH="3"/> 
    <FIELD ID="6" xsi:type="CharFixed" LENGTH="60"/> 
    <FIELD ID="7" xsi:type="CharFixed" LENGTH="1"/> 
    <FIELD ID="8" xsi:type="CharTerm" TERMINATOR="\r\n" /> 
    </RECORD> 
    <ROW> 
    <COLUMN SOURCE="1" NAME="C1" xsi:type="SQLCHAR" /> 
    <COLUMN SOURCE="2" NAME="C2" xsi:type="SQLCHAR" /> 
    <COLUMN SOURCE="3" NAME="C3" xsi:type="SQLCHAR" /> 
    <COLUMN SOURCE="4" NAME="C4" xsi:type="SQLCHAR" /> 
    <COLUMN SOURCE="5" NAME="C5" xsi:type="SQLCHAR" /> 
    <COLUMN SOURCE="6" NAME="C6" xsi:type="SQLCHAR" /> 
    <COLUMN SOURCE="7" NAME="C7" xsi:type="SQLCHAR" /> 
    </ROW> 
</BCPFORMAT> 

(該BULK INSERT命令比格式文件名相同的問題,其他的。)

+0

謝謝你的解釋, – user2151863