Как вставить одну строку R data.frame в базу данных SQL Server? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь добавить новую строку данных в существующую базу данных SQL Server.

Эти:

sqlQuery(con, paste("INSERT INTO df1 SELECT * FROM df2"))

sqlQuery(con, paste("INSERT INTO df1 SELECT * FROM ", df2))

sqlQuery(con, paste("INSERT INTO df1 SELECT * FROM ", sqldf("SELECT * FROM df2")))

Все выдают ошибку:

[1] "42S02 -1305 [Microsoft] [ODBC Microsoft Access Driver] Ядро базы данных Microsoft Jet не может найти таблицу ввода или запрос 'col_1_val'. Убедитесь, что оно существует и что его имя написано правильно."

[2] "[RODBC] ОШИБКА: не удалось SQLExecDirect 'INSERT INTO df1 SELECT * FROM col_1_val'"

col_1_val - это значение первого столбца в df2

При прохождении маршрута sqlSave:

sqlSave(con, df2, tablename = "df1", append = TRUE, rownames = FALSE, colnames = FALSE)

выдает ошибку выделения памяти:

Ошибка в odbcUpdate (канал, запрос, mydata, coldata [m,], test= test,: 'Calloc' не удалось выделить память (1073741824 из 1 байта)

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Если предположить, что имена и порядок столбцов в df1 и df2 идентичны, это должно сработать:

query <- 
  paste0("INSERT INTO df1 ",
         "(", paste0(names(df2), collapse = ", "), ") ",
         "VALUES (",
         paste0(rep("?", length(df2)), collapse = ", "), ")")

library(RODBCext)

sqlExecute(con, 
           query,
           data = df2)

Написанный запрос выглядит следующим образом при использовании mtcars as df1.

"INSERT INTO df1 (mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb) VALUES ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"

Это позволяет вам генерировать оператор, который добавляет все имена столбцов в запрос без необходимости их объявления вручную.Использование sqlExecute вызывает параметризованный запрос.Затем вопросительные знаки привязываются к вашим данным и затем выполняются как часть инструкции.

0 голосов
/ 13 июня 2018

TRY

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

, если вы хотите столбцы из таблицы 2

INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT  table2.column1, table2.column2, 8, 'some string etc.'
FROM    table2
...