我正在努力将新行数据附加到现有的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_val
是df2
走sqlSave
路线:
sqlSave(con, df2, tablename = "df1", append = TRUE, rownames = FALSE, colnames = FALSE)
抛出内存分配错误:
odbcUpdate出错(频道,查询,mydata,coldata [m,],test = test,:' Calloc'无法分配内存(1073741824 of 1 bytes)
答案 0 :(得分:2)
假设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
作为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