批量加载数据转换错误 - 找不到答案
Bulk Load Data Conversion Error - Can't Find Answer
出于某种原因,我在尝试将 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:\pathway\file.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW = 2
);
Table 模式 - 这是一个独立的 table(进一步的计算和额外的 table 是基于这个单一的 table,但是在批量计算时插入它是唯一的 table)
很可能是您的数据有误。也就是说,存在无法显式转换为 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]%'
最后的语句 returns/deletes 行中有数字、句点或连字符以外的内容。
对于您的日期列,您可以按照上述相同的逻辑,将列更改为 VARCHAR
,然后使用 ISDATE() 查找无法转换的列,从而找到您的错误.
我敢打赌你的数据集中有一些奇怪的字符。在 Notepad++ 中打开数据集并查看数据。任何偏差都应该很快变得明显!问题来自 Col75,它影响了前几行,因此之后的所有内容也无法加载。
确保 .csv 未使用文本限定符,并且 .csv 中的 none 个字段在所需值内有一个逗号。
我现在正在为这个问题苦苦挣扎。问题是我有一个 68 列的报告正在尝试导入。
第 17 列是“说明”列,在逗号分隔符的顶部有一个双引号文本限定符。
带有逗号字段终止符的批量插入不会识别双引号文本限定符,也不会将所有数据合并到有问题的列的右侧。
看起来要克服这个问题,您需要创建一个 .fmt 文件来指示批量插入需要将哪些列视为简单分隔列,以及哪些列需要作为分隔列和限定列处理(see this answer).
出于某种原因,我在尝试将 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:\pathway\file.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
FIRSTROW = 2
);
Table 模式 - 这是一个独立的 table(进一步的计算和额外的 table 是基于这个单一的 table,但是在批量计算时插入它是唯一的 table)
很可能是您的数据有误。也就是说,存在无法显式转换为 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]%'
最后的语句 returns/deletes 行中有数字、句点或连字符以外的内容。
对于您的日期列,您可以按照上述相同的逻辑,将列更改为 VARCHAR
,然后使用 ISDATE() 查找无法转换的列,从而找到您的错误.
我敢打赌你的数据集中有一些奇怪的字符。在 Notepad++ 中打开数据集并查看数据。任何偏差都应该很快变得明显!问题来自 Col75,它影响了前几行,因此之后的所有内容也无法加载。
确保 .csv 未使用文本限定符,并且 .csv 中的 none 个字段在所需值内有一个逗号。
我现在正在为这个问题苦苦挣扎。问题是我有一个 68 列的报告正在尝试导入。
第 17 列是“说明”列,在逗号分隔符的顶部有一个双引号文本限定符。
带有逗号字段终止符的批量插入不会识别双引号文本限定符,也不会将所有数据合并到有问题的列的右侧。
看起来要克服这个问题,您需要创建一个 .fmt 文件来指示批量插入需要将哪些列视为简单分隔列,以及哪些列需要作为分隔列和限定列处理(see this answer).