批量加载数据转换错误 - 找不到答案

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)

很可能是您的数据有误。也就是说,存在无法显式转换为 NUMERICDECIMAL 的字符或值。检查并修复它的一种方法是

  1. [Delta_SM_RR] numeric(10,5)更改为[Delta_SM_RR] nvarchar(256)
  2. 运行批量插入
  3. 找到您的错误行:select * from Example_Table where [Delta_SM_RR] like '%[^-.0-9]%'
  4. 在源头修复数据,或者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).