Используя 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 или с сервера. Кто-нибудь знает, что является причиной этой ошибки и как ее обойти?
Извиняюсь за то, что не могу предоставить информацию о соединении с сервером или данные в моем фрейме данных.
Спасибо.
EDIT>
Пример строки из этого кадра данных:
или dput:
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)