使用R并对错误进行故障排除,我发现了DBI :: dbWriteTable的一个有趣的限制(似乎有)。
我正在尝试将大型数据my.df
帧写入sql服务器。
dim(my.df)
=> 19391 18
dbWriteTable(conn = connection, name = "name_of_table", value = my.df, row.names = FALSE, append=TRUE)
但这失败并显示错误(似乎被截断了):
Error in result_insert_dataframe(rs@ptr, values) :
nanodbc/nanodbc.cpp:1587: 42000: [Microsoft][ODBC Driver 17 for SQL Server][SQL Se
现在有趣的是,将行限制为my.df[1:1456,]
是可行的,没问题:
dbWriteTable(conn = connection, name = "name_of_table", value = my.df[1:1456,], row.names = FALSE, append=TRUE)
但是现在尝试my.df[1:1457,]
并返回上一个错误:
dbWriteTable(conn = connection, name = "name_of_table", value = my.df[1:1457,], row.names = FALSE, append=TRUE)
检查1457不是有问题的行,以下通过:
dbWriteTable(conn = connection, name = "name_of_table", value = my.df[1457,], row.names = FALSE, append=TRUE)
我不确定这是R还是服务器的限制。是否有人对导致此错误的原因以及解决该错误的最佳方法有任何见识?
很抱歉,我无法提供服务器连接详细信息或数据框中的数据。
谢谢。
编辑>
或检测结果:
dput(one_row.df)
:
structure(list(name = 2272L, name = 0.067, name = 1, name = 1,
name = 1, name = 0.067, name = FALSE, name = FALSE, name = TRUE,
name = TRUE, name = TRUE, name = TRUE, name = TRUE, name = TRUE,
name = TRUE, name = 0.402, name = structure(1530282001.49934, class = c("POSIXct",
"POSIXt")), name = "0"), .Names = c("name", "name", "name",
"name", "name", "name", "name", "name", "name", "name", "name",
"name", "name", "name", "name", "name", "name", "name"), row.names = 5L, class = "data.frame")
半复制示例
在上面的示例行中,我仅复制了该行多次,并在writetable中使用了该行。这次通过了1024行,但是1025行失败,如以下输出所示。我还列出了它们的尺寸。
> dbWriteTable(connection, name = "name_of_table", value = mefa:::rep.data.frame(one_row.df, times = 1024), row.names = FALSE, append=TRUE)
> dbWriteTable(connection, name = "name_of_table", value = mefa:::rep.data.frame(one_row.df, times = 1025), row.names = FALSE, append=TRUE)
Error in result_insert_dataframe(rs@ptr, values) :
nanodbc/nanodbc.cpp:1587: 42000: [Microsoft][ODBC Driver 17 for SQL Server][SQL Se
> mefa:::rep.data.frame(one_row.df, times = 1024) %>% object.size()
105808 bytes
> mefa:::rep.data.frame(one_row.df, times = 1025) %>% object.size()
105952 bytes
原始df行的大小为:
object.size(my.df[1:1456,])
=已通过的154464字节object.size(my.df[1:1457,])
= 154608字节失败EDIT2>包括服务器连接详细信息
connnection <- DBI::dbConnect(odbc::odbc(),
Driver = "ODBC Driver 17 for SQL Server",
Server = "server-name",
Database = "db",
UID = "db_user",
PWD = "db_password",
Port = 1433)