使用 BCP 将 csv 文件上传到 SQL 服务器数据库时日期时间字段溢出

Datetime field overflow when uploading csv file to SQL Server Database using BCP

几天来我一直在努力解决这个问题。我有一个 Pandas 数据框,我将其导出到这样的 csv 文件中:

df.to_csv(csv_name, index=False, header = False, encoding='utf-8-sig', sep='\t')

我需要使用 BCP 将此 csv 文件上传到 SQL 服务器数据库,使用以下命令:

bcp [DB].[dbo].[Table] in file.csv -Sserver -Uuser -Ppass -c -C65001  -t "\t" -e error.log

每次我 运行 它,我都会得到这个错误:

Error = [Microsoft][ODBC Driver 17 for SQL Server]Datetime field overflow. Fractional second precision exceeds the scale specified in the parameter binding.

查看 error.log 时,我发现我要上传的日期值有问题。在 table 定义中,日期格式是“smalldatetime”。我要上传的实际值为“2020-05-30 12:55:22”。

我只是将单行数据框导出到 csv。

这是我收到的错误消息(也显示了 csv 文件的内容):

@ Row 1, Column 8: Datetime field overflow. Fractional second precision exceeds the scale specified in the parameter binding. @#
165405677   156147965   1135358 1425879 3.5 "Nice value Bordeaux Blend 
Deep purple color.  Blackberry   plum    tobacco and oaky with hints of pepper.  Full-bodied     dry and slightly spicy taste.
Let it breathe for at least 1 hr
Pairs well with pecorino and salami crostini
#uncorkingArgentina"    en  2020-05-30T19:55:42.000Z    True    2   444897692   67  8   "49  292     320     334     422"   "'blackberry'    'oaky'  'pepper'    'plum'  'tobacco'" 3353    0   Completed   89036   3.7 536982,90,Normal,71,3.6,484,26,,,"Nice value Bordeaux Blend 
Deep purple color.  Blackberry, plum, tobacco and oaky with hints of pepper.  Full-bodied, dry and slightly spicy taste.
Let it breathe for at least 1 hr
Pairs well with pecorino and salami crostini
#uncorkingArgentina",False,True

这是我在 SQL Server

中的 table 定义
CREATE TABLE [Table] (

    [column1] bigint PRIMARY KEY,
    [column2] bigint,
    [column3] bigint,
    [column4] bigint,
    [column5] float(53),
    [column6] nvarchar(1500) COLLATE Latin1_General_100_CI_AI_SC_UTF8, 
    [column7] nvarchar(5) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column8] smalldatetime, 
    [column9] bit,
    [column10] nvarchar(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column11] bigint,
    [column12] integer,
    [column13] integer,
    [column14] nvarchar(150) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column15] nvarchar(500) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column16] bigint,
    [column17] integer,
    [column18] nvarchar(50) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column19] integer,
    [column20] float(53),
    [column21] integer,
    [column22] integer,
    [column23] nvarchar(60) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column24] integer,
    [column25] float(53),
    [column26] integer,
    [column27] integer,
    [column28] nvarchar(255) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column29] nvarchar(255) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column30] nvarchar(1500) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
    [column31] bit,
    [column32] bit
)
GO

我尝试上传其他行,但无论该行的其他内容是什么,我总是对每一行的日期值有问题。

我已尽一切努力修复它。你认为这个问题的原因是什么?谢谢!

将数据加载到暂存区 table,其中所有列都是字符串。

然后您可以查看数据并确定发生转换错误的位置,使用如下逻辑:

select s.*
from staging s
where try_convert(smalldatetime, column8) is null and column8 is not null;