首页 > 解决方案 > 如何将单行 R data.frame 插入 SQL Server 数据库?

问题描述

我正在努力将新的数据行附加到现有的 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 个字节)

标签: sqlrsql-serverrodbc

解决方案


假设 和 中的列的名称和顺序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 ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"

这允许您生成将所有列名添加到查询中的语句,而无需手动声明它们。UsingsqlExecute调用参数化查询。然后问号绑定到您的数据,然后作为语句的一部分执行。


推荐阅读