由于某种原因,我在尝试将CSV文件批量插入SQL Express时不断收到以下错误:
Bulk load data conversion error (type mismatch or invalid character for the
specified codepage) for row 2, column 75 (Delta_SM_RR).
Msg 4864, Level 16, State 1, Line 89
Bulk load data conversion error (type mismatch or invalid character for the
specified codepage) for row 3, column 75 (Delta_SM_RR).
Msg 4864, Level 16, State 1, Line 89
Bulk load data conversion error (type mismatch or invalid character for the
specified codepage) for row 4, column 75 (Delta_SM_RR).
... etc.
我一直在尝试将此列作为十进制和数字插入,并不断收到相同的错误(如果我取出此列,则后续列会出现相同的错误(。
请参阅下面的数据示例,此列中的所有数据点都包含小数,并且都在小数点后四舍五入:
Delta_SM_RR
168.64
146.17
95.07
79.85
60.52
61.03
-4.11
-59.57
1563.09
354.36
114.78
253.46
451.5
任何形式的帮助或建议将不胜感激,因为似乎SO的许多人都遇到了这个问题。此外,如果有人知道另一种将 CSV 加载到 SSMS 中的自动化方法,那也将是一个很大的帮助。
编辑:
Create Table Example_Table
(
[Col_1] varchar(255),
[Col_2] numeric(10,5),
[Col_3] numeric(10,5),
[Col_4] numeric(10,5),
[Col_5] date,
[Delta_SM_RR] numeric(10,5),
)
GO
BULK INSERT
Example_Table
FROM 'C:pathwayfile.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = 'n',
FIRSTROW = 2
);
表架构 - 这是一个独立的表(进一步的计算和其他表基于这个单个表构建,但在批量插入时它是唯一的表(
您的数据中可能存在错误。也就是说,存在无法显式转换为 NUMERIC
或 DECIMAL
的字符或值。检查并修复它的一种方法是
- 将
[Delta_SM_RR] numeric(10,5)
更改为[Delta_SM_RR] nvarchar(256)
- 运行批量插入
- 查找错误行:
select * from Example_Table where [Delta_SM_RR] like '%[^-.0-9]%'
- 在源或
delete from Example_Table where [Delta_SM_RR] like '%[^-.0-9]%'
修复数据
最后一个语句返回/删除除数字、句点或连字符以外的行。
对于日期列,您可以遵循上述相同的逻辑,通过将列更改为 VARCHAR
,然后使用 ISDATE(( 查找无法转换的错误。
我敢打赌,你的数据集中有一些奇怪的字符。 在记事本++中打开数据集并查看数据。 任何畸变都应该很快变得明显! 问题来自Col75,它影响了前几行,因此之后的所有内容也无法加载。
确保.csv没有使用文本限定符,并且.csv中的任何字段都没有在所需值内有逗号。
我现在正在为这个问题而苦苦挣扎。问题是我有一个 68 列的报告,我正在尝试导入。
第 17 列是"说明"列,在逗号分隔符的顶部有一个双引号文本限定符。
使用逗号字段终止符进行批量插入不会标识双引号文本限定符,也不会在违规列的右侧修改所有数据。
看起来要克服这个问题,您需要创建一个 .fmt 文件来指示批量插入需要将哪些列视为简单分隔,以及哪些列需要被视为分隔和限定(请参阅此答案(。