首页 > 解决方案 > SQL 批量插入忽略第一个数据行

问题描述

我正在尝试使用批量插入(带有 unix 样式行终止符的 UTF-8)将管道分隔文件导入临时表,但它一直忽略第一个数据行(标题后面的那个),我不知道为什么。添加|到标题行也无济于事......

文件内容:

SummaryFile_20191017140001.dat|XXXXXXXXXX|FIL-COUNTRY|128
File1_20191011164611.dat|2|4432|2|Imported||
File2_20191011164611.dat|3|4433|1|Imported||
File3_20191011164611.dat|4|4433|2|Imported||
File4_20191011164611.dat|5|4434|1|Imported|INV_ERROR|
File5_20191011164611.dat|6|4434|2|Imported||
File6_20191011164611.dat|7|4434|3|Imported||

批量插入不会引发错误,但它一直忽略第一条数据行(File1_...)

下面的SQL:

IF OBJECT_ID('tempdb..#mycsv') IS NOT NULL
DROP TABLE #mycsv

create table #mycsv
    (
        tlr_file_name   varchar(150) null,
        tlr_record_id   int null,
        tlr_pre_invoice_number  varchar(50) null,
        tlr_pre_invoice_line_number varchar(50) null,
        tlr_status  varchar (30) null,
        tlr_error_code  varchar(30) null,
        tlr_error_message   varchar (500) null)

bulk insert #mycsv 
from 'D:\TestData\Test.dat' 
with (
    rowterminator = '0x0A',
    fieldTerminator = '|',
    firstrow = 2, 
    ERRORFILE = 'D:\TestData\Import.log')

select * from #mycsv

这真的让我很烦,因为我真的不知道我错过了什么。如果我指定FirstRow = 1脚本将抛出: Bulk load data conversion error (type mismatch or invalid character for the specified codepage) for row 1, column 2 (tlr_record_id).

提前致谢!

标签: sqlsql-serverbulkinsert

解决方案


“UTF-8 with unix style row terminator”我假设您使用的 SQL Server 版本不支持 UTF-8。从批量插入 (Transact-SQL)

** 重要 ** SQL Server 2016 (13.x) 之前的版本不支持代码页 65001(UTF-8 编码)。

如果您使用的是2016+,则指定 UTF-8 的代码页:

BULK INSERT #mycsv
FROM 'D:\TestData\Test.dat'
WITH (ROWTERMINATOR = '0x0A',
      FIELDTERMINATOR = '|',
      FIRSTROW = 1,
      CODEPAGE = '65001',
      ERRORFILE = 'D:\TestData\Import.log');

如果您不使用 SQL Server 2016+,则不能用于BULK INSERT导入UTF-8文件;您将不得不使用不同的代码页或使用不同的工具。


另请注意,上述文件指出以下内容:

FIRSTROW 属性不打算跳过列标题。BULK INSERT 语句不支持跳过标头。跳过行时,SQL Server 数据库引擎仅查看字段终止符,而不验证跳过行的字段中的数据。

如果您要跳过行,您仍然需要确保该行有效,但它不适用于跳过标题。这意味着您应该使用FIRSTROW = 1和修复标题行,正如@sarlacii 指出的那样。

当然,如果您使用的是旧版本的 SQL Server,这并不能解决代码页问题;我的观点是,你必须在 2014 年及之前使用不同的技术。


推荐阅读