使用R DBI包插入到

使用R DBI包插入到,r,sql-server,odbc,R,Sql Server,Odbc,我正在使用R及其包DBI从多个较小的文件创建一个较大的MS SQL表。使用DBI的dbWriteTable工作得很好,但对于编写大量数据来说速度太慢。因此,我想尝试将T-SQL插入到中,以防速度更快。但是,这似乎不适用于非数字数据。你有什么办法让它工作吗?或者,我愿意使用任何其他解决方案,在大约1小时内将大量(50个拼花文件,每个文件包含100万行和100个变量)加载到SQL server # Load packages library(tidyverse) library(DBI) # Cr

我正在使用R及其包DBI从多个较小的文件创建一个较大的MS SQL表。使用DBI的
dbWriteTable
工作得很好,但对于编写大量数据来说速度太慢。因此,我想尝试将T-SQL
插入到
中,以防速度更快。但是,这似乎不适用于非数字数据。你有什么办法让它工作吗?或者,我愿意使用任何其他解决方案,在大约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,2,3),
                  "id2" = c(1,2,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,], collapse = ','), ");")
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), collapse = ','), ") VALUES (", paste0(b[1,], collapse = ','), ");")
query <- dbSendStatement(connection, query)
dbFetch(query)
#加载包
图书馆(tidyverse)
图书馆(DBI)
#创建到odbc驱动程序的连接
连接字符串