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

Posted

技术标签:

【中文标题】如何将单行 R data.frame 插入 SQL Server 数据库?【英文标题】:How to insert a single row R data.frame into a SQL Server database? 【发布时间】:2018-06-13 13:38:03 【问题描述】:

我正在努力将新的数据行追加到现有的 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_valdf2 中的第一列值

sqlSave路线:

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

抛出内存分配错误:

odbcUpdate 中的错误(通道,查询,mydata,coldata[m,],test = test,:'Calloc' 无法分配内存(1073741824 of 1 个字节)

【问题讨论】:

df1 和 df2 表是否存在? 好吧,至少你需要一个额外的 ) 在每个末尾。 df1 = 现有 SQL Server 数据库和 df2 = 现有 R data.frame How to insert a dataframe into a SQL Server table?的可能重复 iamdave,我在发布之前看到了这个答案,我只需要列出 df1 和 df2 中的所有值吗? 【参考方案1】:

假设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 调用参数化查询。然后问号绑定到您的数据,然后作为语句的一部分执行。

【讨论】:

我无法让任何版本的这个工作,我为什么要代表每一列的 SQL 语句? 抱歉,我放错了括号。 query 应该是长度为 1 的字符向量。我已经在答案中修复了它。 42000 -3502 [Microsoft][ODBC Microsoft Access Driver] INSERT INTO 语句中的语法错误。 [RODBCext] 错误:SQLExecute 失败...服务器上没有足够的存储空间?没有写权限? ODBC Microsoft Access Driver 这是我之前没有发现的错误的一个奇怪部分。我从未在 SQL Server 中使用过该驱动程序。你是如何建立联系的? RODBC::odbcConnectAccess(),我需要直接连接到服务器,不是吗?我的前端是通过Access,后端是SQL数据库【参考方案2】:

试试

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

【讨论】:

但我想要 table2 中的所有列。 现在@SCDCE 怎么样

以上是关于如何将单行 R data.frame 插入 SQL Server 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

将 data.frame 从 R 插入到 Mongodb

如何在R中向一个data frame指定位置插入一列或一行

如何使用R [list]将列表的名称插入到列中

as.data.frame 将嵌套列表展平为单行,而不是为每条记录创建行 [重复]

如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?

如何将 R data.frame 保存为没有空格的 CSV?