如何解决使用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 举报,一经查实,本站将立刻删除。