sql - 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).
提前致谢!
解决方案
“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 年及之前使用不同的技术。
推荐阅读
- html - 将登录页面添加到纸质仪表板角度主题
- javascript - 对来自测试之外的文件的页面标题进行断言
- c# - 在 ASP.Net Core 中创建多对多关系视图?
- javascript - 更新对象数组中的单个项目
- mongodb - 调用mongo存储库的保存方法时未调用Mongo Date Custom Converter
- csv - Neo4j 导入 CSV 文件(neo.TransientError.General.OutOfMemoryError)
- java - Jackson 可以解析不是 ISO-8601 的日期时间值吗?
- java - 使用OkHttp时Webapp卸载内存泄漏,是否误报?
- mariadb - 使用机器的外部 IP 地址时无法连接到数据库
- java - 我需要从线程返回一些东西