DBI dbWriteTable имеет ограничение строки 1457? - PullRequest
0 голосов
/ 29 июня 2018

Используя 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>

Пример строки из этого кадра данных: enter image description here

или 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...