Как показывает исходный код , RODBC::sqlUpdate()
очищает имена столбцов специальных символов (не буквенно-цифровых символов) с помощью функции mangleColNames()
:
mangleColNames <- function(colnames) gsub("[^[:alnum:]_]+", "", colnames)
, который удаляет все пробелы, как показано здесь:
colnames <- "First Name"
mangleColNames <- function(colnames) gsub("[^[:alnum:]_]+", "", colnames)
mangleColNames(colnames)
# [1] "FirstName"
Чтобы решить, рассмотрите один из трех вариантов:
Обновите исходный код вашего пакета библиотеки RODBC, чтобы закомментировать mangleColNames()
вызов в sqlUpdate
. В частности, используйте подход ниже, как показано здесь .
trace("sqlUpdate", edit=TRUE)
Однако выше приведено временное интерактивное исправление для текущего сеанса R. Вам нужно будет перейти к базовому коду пакета библиотеки, чтобы постоянно его корректировать. Обратите внимание: при изменении любого кода возможны побочные эффекты. Действуйте осторожно с таким подходом.
На самом деле, вам все еще может понадобиться добавить обертку для обработки таких пробелов и специальных символов. В MS Access вы должны использовать квадратные скобки или обратные кавычки для работы с такими именами.
Обновлять имена столбцов в MS Access с помощью команд DDL, переданных в sqlQuery
. Кстати, как и во всех СУБД, настоятельно рекомендуется не использовать пробелы, специальные символы или зарезервированные ключевые слова в именах столбцов, таблиц, представлений или других хранимых объектов.
ALTER TABLE mytable ALTER COLUMN fieldname fieldtype
Что бы вы сделали следующим образом и можно зациклить, чтобы обновить все столбцы:
# ADD NEW COLUMN
sqlQuery(channel, "ALTER TABLE mytable ADD COLUMN [FirstName] Text(255)")
sqlQuery(channel, "UPDATE mytable SET [FirstName] = [First Name]")
# DROP OLD COLUMN
sqlQuery(channel, "ALTER TABLE mytable DROP COLUMN [First Name]")
Используйте другую библиотеку, такую как жалоба R DBI, odbc
, которая не имеет sqlUpdate
, но может содержать dbWriteTable()
без предположения имен столбцов.