【问题标题】:How to insert R dataframe into existing table in SQL Server如何将 R 数据框插入到 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 行批次。

标签: sql r sql-server odbc


【解决方案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;")

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多