如何快速将数据从R导出到SQL Server

如何快速将数据从R导出到SQL Server,sql,sql-server,r,bigdata,Sql,Sql Server,R,Bigdata,标准RODBC包的sqlSave函数即使是单个INSERT语句参数fast=TRUE,由于非最小加载,对于大量数据来说也非常慢。如何以最少的日志记录将数据写入SQL server,使其写入速度更快 目前正在尝试: toSQL = data.frame(...); sqlSave(channel,toSQL,tablename="Table1",rownames=FALSE,colnames=FALSE,safer=FALSE,fast=TRUE); 通过在本地将数据写入CSV,然后使用类似于s

标准RODBC包的sqlSave函数即使是单个INSERT语句参数fast=TRUE,由于非最小加载,对于大量数据来说也非常慢。如何以最少的日志记录将数据写入SQL server,使其写入速度更快

目前正在尝试:

toSQL = data.frame(...);
sqlSave(channel,toSQL,tablename="Table1",rownames=FALSE,colnames=FALSE,safer=FALSE,fast=TRUE);

通过在本地将数据写入CSV,然后使用类似于sqlSave的预构建函数不可用的批量插入,可以非常快速地将数据写入MS SQL Server

toSQL = data.frame(...);
write.table(toSQL,"C:\\export\\filename.txt",quote=FALSE,sep=",",row.names=FALSE,col.names=FALSE,append=FALSE);
    sqlQuery(channel,"BULK
                INSERT Yada.dbo.yada
                FROM '\\\\<server-that-SQL-server-can-see>\\export\\filename.txt'
                WITH
                (
                FIELDTERMINATOR = ',',
                ROWTERMINATOR = '\\n'
                )");
SQL Server必须具有访问保存CSV文件的网络文件夹的权限,否则此过程将不起作用。虽然它需要一些具有各种权限的设置,比如网络文件夹和批量管理权限,但速度上的回报是非常有价值的。

我完全同意批量插入是任何非微小数据的正确选择。 但是,如果您需要添加2-3行(例如调试消息),则批量插入似乎是一种过激行为

您的问题的答案是DBI::dbWriteTable函数。下面的示例我正在将我的R代码连接到MS SQL Express的AWS RDS实例:

对于传输的少量数据,它工作得非常快,如果您想要data.frame->SQL表解决方案,它看起来相当优雅


享受吧

这是@Jpd527提供的解决方案的后续问题。我认为filename.txt应该是filename.csv,对吗?只是您提到将数据保存为csv会有帮助,但我似乎在您的解决方案中没有看到csv。您可能会这么认为,但批量插入命令很挑剔,需要一个.txt。文件的实际内容与CSV相同;唯一的区别是一个语义文件结尾让SQL高兴。谢谢@jpd527,这太棒了。我对.csv文件也有类似的情况和疑问。谢谢你的提示。RJDBC比RODBC慢得多,安装起来也困难得多。标准sqlSave仅在几行中以类似可忽略的毫秒数返回。
library(DBI)
library(RJDBC)
library(tidyverse)

# Specify where you driver lives
drv <- JDBC(
  "com.microsoft.sqlserver.jdbc.SQLServerDriver",
  "c:/R/SQL/sqljdbc42.jar") 

# Connect to AWS RDS instance
conn <- drv %>%
  dbConnect(
    host = "jdbc:sqlserver://xxx.ccgqenhjdi18.ap-southeast-2.rds.amazonaws.com",
    user = "xxx",
    password = "********",
    port = 1433,
    dbname= "qlik")

if(0) { # check what the conn object has access to
  queryResults <- conn %>%
    dbGetQuery("select * from information_schema.tables")
}

# Create test data
example_data <- data.frame(animal=c("dog", "cat", "sea cucumber", "sea urchin"),
                           feel=c("furry", "furry", "squishy", "spiny"),
                           weight=c(45, 8, 1.1, 0.8))
# Works in 20ms in my case
system.time(
  conn %>% dbWriteTable(
    "qlik.export.test",
    example_data
  )
)

# Let us see if we see the exported results
conn %>% dbGetQuery("select * FROM qlik.export.test")

# Let's clean the mess and force-close connection at the end of the process
conn %>% dbDisconnect()