是否可以使用 RODBC 包批量插入 MS-SQL Server(2000、2005、2008)?
我知道我可以使用 freebcp 做到这一点,但我很好奇 RODBC 包是否实现了 Microsoft SQL API 的这一部分,如果没有,实现它会有多困难。
检查新的odbc
和DBI
包。DBI::dbWriteTable
每秒写入大约 20,000 条记录...比 Row Inserts 快得多RODBC::sqlSave()
?sqlSave
当您INSERT INTO
设置Fast=True
.
现在您可以 dbBulkCopy
从新的rsqlserver 包中使用:
一个典型的场景:
dbBulkCopy
读取 fil 并使用bcp
MS Sql 服务器的内部工具将其插入。这假设您的表已经在数据库中创建:
dat <- matrix(round(rnorm(nrow*ncol),nrow,ncol)
id.file = "temp_file.csv"
write.csv(dat,file=id.file,row.names=FALSE)
dbBulkCopy(conn,'NEW_BP_TABLE',value=id.file)
使用 RODBC,我们能够创建的最快插入(2.6 亿行插入)如下所示(在 R 伪代码中):
ourDataFrame <- sqlQuery(OurConnection, "SELECT myDataThing1, myDataThing2
FROM myData")
ourDF <- doStuff(ourDataFrame)
write.csv(ourDF,ourFile)
sqlQuery(OurConnection, "CREATE TABLE myTable ( la [La], laLa [LaLa]);
BULK INSERT myTable FROM 'ourFile'
WITH YOURPARAMS=yourParams;")
如果你在服务器之间运行这个,你需要一个 R 服务器可以写入的网络驱动器(例如,一个有权写入数据库的服务器使用 Rscript 来生产代码),并且 SQL Server 可以从中读取。
从我能找到的一切来看,没有批量插入 MySQL 的解决方案,也没有任何适用于 SSIS 的解决方案,这就是为什么微软在购买 Revolution R Analytics 后将数据库内分析与 SQL Server 2016 结合起来。
我试图评论先前的答案,但没有这样做的声誉。
该rsqlserver
包需要运行,rClr
并且这些包都没有表现良好,特别是因为rsqlserver
's INSERT 函数的数据类型处理很差。因此,如果您使用它,您将不知道您在 SQL 表中查看的是什么,因为您的 data.frame 中的大部分信息都将被转换。
考虑到该RODBC
软件包已经存在了 15 年,我很失望没有人创建批量插入功能......
我们的n2khelper
包bcp
在可用时可以使用(批量复制)。当不可用时,它会退回到多个 INSERT 语句。
您可以在https://github.com/INBO-Natura2000/n2khelper上找到该软件包
安装它devtools::install_git("INBO-Natura2000/n2khelper")
并寻找odbc_insert()
功能。