如何将 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

如何一次性将完整的 R 数据框插入 SQL 表

如何将记录插入到 sql server express 数据库表中?

如何使用 Databricks 使用服务原理通过 spark 数据框将批量数据插入 Sql Server 数据仓库

将数据框从 R 插入 SQL 的有效方法

如何在 SQL Server 中插入多行?