使用R DBI包插入到
我正在使用R及其包DBI从多个较小的文件创建一个较大的MS SQL表。使用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
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驱动程序的连接
连接字符串