批量插入扁平utf-8与áåóñ

时间:2016-11-28 11:38:57

标签: sql-server utf-8

我有一个平面文件,我想将其批量插入SQL服务器(2016)。

 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

但在格式文件中我设置了字段的长度

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áåóñ...

    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

任何想法?

1 个答案:

答案 0 :(得分:0)

目前还不清楚BCP在使用UTF-8时是否完全支持使用格式文件 - 您的经验表明它并非如此。 导入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命令与问题中的命令相同,但格式文件名除外。)