使用R DBI软件包插入INTO

问题描述

我正在与R及其程序包DBI一起使用多个较小的文件创建大型MS sql表。使用DBI的dbWriteTable可以很好地工作,但是对于写入大量数据来说太慢了。因此,我想尝试一下T-sql INSERT INTO,以防它更快。但是,这似乎不适用于非数字数据。任何想法如何使它工作?另外,我愿意接受任何其他解决方案,以在大约1小时内将大量(50个镶木文件,100万行和100个变量)加载到sql Server。

# Load packages
library(tidyverse)
library(DBI)

# Create connection to odbc driver
connection_string <- paste0(
  "DRIVER={ODBC Driver 17 for sql Server};","SERVER=",env$server,";","DATABASE=",env$database,"UID=",env$uid,"PWD=",env$pwd,"Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30"
)
connection <- DBI::dbConnect(odbc::odbc(),.connection_string=connection_string)

# Create dataframe a and b
a <- data.frame("id" = c("a","b","c"),"id1" = c("a1","b1","c1"),"id2" = c("1","2","3"))
b <- data.frame("id" = c(1,2,3),"id1" = c(1,"id2" = c(1,3))
## Variables as character or numeric
a$id <- as.character(a$id)
a$id1 <- as.character(a$id1)
a$id2 <- as.numeric(as.character(a$id2))

# Drop any pre-existing temp.tmp1 sql table
query = paste0("DROP TABLE temp.tmp1")
query <- dbSendStatement(connection,query)
dbFetch(query)
  
# Create new temp.tmp1 sql table
query = paste0("CREATE TABLE temp.tmp1 (id varchar(1000),id1 varchar(1000),id2 float)")
query <- dbSendStatement(connection,query)
dbFetch(query)
  
# Append dataframe a to temp.tmp1 sql table
query = paste0("INSERT INTO temp.tmp1 (",paste0(colnames(a),collapse = ','),") VALUES (",paste0(a[1,],");")
query <- dbSendStatement(connection,query)
dbFetch(query)

## THIS PRODUCES THE ERROR
## Error: nanodbc/nanodbc.cpp:1617: 00000: [Microsoft][ODBC Driver 17 for sql Server][sql Server]Invalid column name 'a'.  [Microsoft][ODBC Driver 17 for sql Server][sql Server]Invalid column name 'a1'.  [Microsoft][ODBC Driver 17 for sql Server][sql Server]Statement(s) Could not be prepared. 
## <sql> 'INSERT INTO temp.tmp1 (id,id1,id2) VALUES (a,a1,1);'


# Append dataframe b to temp.tmp1 sql table
## THIS WORKS
query = paste0("INSERT INTO temp.tmp1 (",paste0(colnames(b),paste0(b[1,query)
dbFetch(query)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)