我已经尝试了好几天来解决这个问题。我有一个 Pandas 数据框,我将其导出到 csv 文件,如下所示:
df.to_csv(csv_name, index=False, header = False, encoding='utf-8-sig', sep='\t')
我需要使用 BCP 将此 csv 文件上传到 SQL Server 数据库,使用以下命令:
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 时,我发现我要上传的日期值有问题。在表定义中,日期格式为“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 中的表定义
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
我尝试上传另一行,但每一行的日期值总是有问题,无论该行的其他内容是什么。
我尝试了一切方法来解决它。您认为这个问题的原因是什么?谢谢!
将数据加载到临时表中,其中所有列都是字符串。
然后您可以查看数据并使用以下逻辑确定发生转换错误的位置:
select s.*
from staging s
where try_convert(smalldatetime, column8) is null and column8 is not null;
在我的例子中,我使用 Python 包
bcpandas
来自动化将 Pandas 数据帧发送到 SQL Server 的 BCP 部分。我的值对于 SQL Server 来说精度太高,例如 2024-02-29 12:02:56.834863
,并且收到此错误。
我使用此命令来降低日期时间列的精度:
logs['action_date'] = pd.to_datetime(logs['action_date']).dt.floor('ms')
之后BCP写入成功。