【问题标题】:Bulk insert flat utf-8 with áåóñ带 áåóñ 的批量插入平面 utf-8
【发布时间】:2016-11-28 11:38:56
【问题描述】:

我有一个平面文件,我想将其批量插入 SQL Server (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              ""

我拥有的其他类似格式的文件效果很好,除了这个。 我得到的错误是包含字符的行被截断 áåóñ...

    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

有什么想法吗?

【问题讨论】:

  • 目标表中列的数据类型是什么?
  • 数据类型是 nvarchar,长度与 fmt 文件中的长度相同 (Field1[nvarchar](22))...
  • 未经测试,但您可能需要使用SQLNCHAR 而不是SQLCHAR 作为格式文件中每一列的数据类型 (msdn.microsoft.com/en-us/library/ms189110.aspx)
  • 已经试过了,SQLNCHAR 和 SQLNVARCHAR 但我得到每个字段的截断错误Bulk load data conversion error (truncation) for row 1, column 4
  • 格式文件似乎与示例数据不匹配;该文件每行包含 91 个字符,但格式文件允许 102

标签: sql-server utf-8


【解决方案1】:

尚不清楚在使用 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命令与问题中的相同,除了格式文件名。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 2012-02-16
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多