Ошибка RODBC: невозможно вставить явное значение для столбца идентификации

Я пытаюсь добавить записи в существующую таблицу SQL, используя метод sqlSave в пакете RODBC.

df <- data.frame(EmployeeID = c(NA, NA, NA), EmployeeName=c("Bob", "Sue", "Jane"))

sqlSave(myconn, dat=df, tablename = "Employees", append = TRUE, rownames = FALSE, colnames = FALSE, verbose = TRUE, safer = TRUE, 
        addPK = FALSE, typeInfo, varTypes, fast = TRUE, test = FALSE, nastring = NULL)

Тем не менее, я продолжаю получать ошибку

[RODBC] Ошибка выполнения в обновлении 23000 544 [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Не удается вставить явное значение для столбца идентификаторов в таблицу «Сотрудники», если для параметра IDENTITY_INSERT установлено значение OFF.

Моя таблица должна автоматически создавать идентификаторы. Что дает?


person Ben    schedule 23.04.2015    source источник
comment
Вы пытались исключить столбец EmployeeID из data.frame? С помощью этого метода вы пытаетесь добавить значения NULL в столбец EmployeeID. Лучше оставить эти значения неуказанными для добавления.   -  person MrFlick    schedule 23.04.2015
comment
@MrFlick да, и в этом случае я получаю, что длина ошибки «dimnames» [2] не равна размеру массива. Это сообщение очень похоже, но ответ не действительно помочь.   -  person Ben    schedule 24.04.2015


Ответы (1)


Добавление этого ответа, поскольку я нашел хакерский обходной путь для этой проблемы.

  1. Включить Identity_Insert
sqlQuery(myconn, "Set Identity_Insert Employees On", errors = TRUE)
  1. Выполнить запрос sqlSave. Загвоздка здесь в том, что вам нужно вставлять идентификаторы вручную, что означает, что вы несете ответственность за проверку их уникальности и последовательности. В моем случае я знаю, что моя таблица будет пустой перед вставкой, поэтому я могу просто установить rownames и addPK в TRUE.
sqlSave(
  myconn, 
  dat=df, 
  tablename = "Employees", 
  append = TRUE, rownames = TRUE, 
  colnames = FALSE, 
  verbose = TRUE, 
  safer = TRUE, 
  addPK = TRUE, 
  fast = TRUE, 
  test = FALSE, 
  nastring = NULL
)
  1. Отключите Identity_Insert
sqlQuery(myconn, "Set Identity_Insert Employees Off", errors = TRUE)
person Ben    schedule 24.04.2015