如何将单行R data.frame插入SQL Server数据库?

时间:2018-06-13 13:38:03

标签: sql r sql-server rodbc

我正在努力将新行数据附加到现有的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驱动程序] Microsoft Jet数据库引擎找不到输入表或查询' col_1_val'。确保它存在并且其名称拼写正确。"

     

[2]" [RODBC]错误:无法SQLExecDirect' INSERT INTO df1 SELECT * FROM col_1_val'"

col_1_valdf2

中的第一个列值

sqlSave路线:

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

抛出内存分配错误:

  

odbcUpdate出错(频道,查询,mydata,coldata [m,],test = test,:' Calloc'无法分配内存(1073741824 of 1 bytes)

2 个答案:

答案 0 :(得分:2)

假设df1df2中列的名称和顺序相同,这应该有效:

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

library(RODBCext)

sqlExecute(con, 
           query,
           data = df2)

使用mtcars作为df1时,写入的查询如下所示。

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

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

答案 1 :(得分:-1)

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