如何将 R 数据框插入到 SQL Server 中的现有表中
Posted
技术标签:
【中文标题】如何将 R 数据框插入到 SQL Server 中的现有表中【英文标题】:How to insert R dataframe into existing table in SQL Server 【发布时间】:2019-02-14 14:28:06 【问题描述】:在尝试了一些在网上找到的不同包和方法后,我还没有找到一种解决方案,可以将 R 中的数据框插入到 SQL Server 中的现有表中。 我在 mysql 上取得了巨大的成功,但 SQL Server 似乎更难。
我已经设法使用 DBI 包编写了一个新表,但我找不到使用此方法插入的方法。看文档,好像没有插入的方法。
由于有超过 1000 行数据,使用 RODBC 包中的 sqlQuery 似乎也不可行。
任何人都可以建议一种将数据框中的大量数据插入现有 SQL 表的工作方法吗?
【问题讨论】:
我建议使用 library(odbc) 和dbWriteTable(myCon, "myTable", myTable, append = TRUE)
或 dbExecute(myCon, sprintf("INSERT INTO myTable VALUES (%s);", paste(myValues, collapse = "),(")))
构造。请参阅这个相关的question 和这个有用的comment 关于这个主题。
这是否仍会受到 SQL Server 中最大 1000 行插入限制的限制?
不幸的是,是的。在我的例子中,我编写了一个循环,将数据插入 1000 行批次。
【参考方案1】:
我在使用 R 和使用 r-postgres 特定驱动程序的 PostGreSQL 时也有类似的需求。我想 SQLServer 可能存在类似的问题。我发现的最佳解决方案是使用 dbWriteTable 或其中一个从流写入以加载非常大的表(例如,对于 Postgres、postgresqlCopyInDataframe)的底层函数写入数据库中的临时表。后者通常需要更多的工作来定义和对齐 SQL 数据类型和 R 类类型以确保写入,而 dbWriteTable 往往更容易一些。一旦写入临时表,然后发出 SQL 语句以插入到您的表中,就像您在数据库环境中一样。下面是一个使用高级 DBI 库数据库调用的示例:
dbExecute(conn,"start transaction;")
dbExecute(conn,"drop table if exists myTempTable")
dbWriteTable(conn,"myTempTable",df)
dbExecute(conn,"insert into myRealTable(a,b,c) select a,b,c from myTempTable")
dbExecute(conn,"drop table if exists myTempTable")
dbExecute(conn,"commit;")
【讨论】:
以上是关于如何将 R 数据框插入到 SQL Server 中的现有表中的主要内容,如果未能解决你的问题,请参考以下文章
如何将记录插入到 sql server express 数据库表中?