【发布时间】:2010-11-26 23:36:53
【问题描述】:
是否可以使用 RODBC 包对 MS-SQL Server(2000、2005、2008)执行批量插入?
我知道我可以使用 freebcp 做到这一点,但我很好奇 RODBC 包是否实现了 Microsoft SQL API 的这一部分,如果没有,实现它会有多困难。
【问题讨论】:
是否可以使用 RODBC 包对 MS-SQL Server(2000、2005、2008)执行批量插入?
我知道我可以使用 freebcp 做到这一点,但我很好奇 RODBC 包是否实现了 Microsoft SQL API 的这一部分,如果没有,实现它会有多困难。
【问题讨论】:
查看新的 odbc 和 DBI 软件包。 DBI::dbWriteTable 每秒写入大约 20,000 条记录...比 RODBC::sqlSave() 的 Row Inserts 快得多
【讨论】:
odbc,它会产生错误:ERROR: lazy loading failed for package 'blob'
您可能正在寻找?sqlSave,它在您设置Fast=True 时使用参数化的INSERT INTO 查询(在一次操作中发生)。
【讨论】:
现在您可以使用新的rsqlserver 包中的dbBulkCopy:
一个典型的场景:
dbBulkCopy 读取文件并使用MS Sql 服务器内部的bcp 工具将其插入。这假设您的表已经在数据库中创建:
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)
【讨论】:
rClr 包。但是我们鼓励您从 GITHUB 使用它,并且会很高兴收到任何反馈。
使用 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 的 INSERT 函数的数据类型处理能力很差。因此,如果您使用它,您将不知道您在 SQL 表中查看的是什么,因为您的 data.frame 中的大部分信息都将被转换。
考虑到RODBC 包已经存在了 15 年,我很失望没有人创建批量插入功能......
【讨论】:
我们的n2khelper 包在可用时可以使用bcp(批量复制)。当不可用时,它会退回到多个 INSERT 语句。
你可以在https://github.com/INBO-Natura2000/n2khelper找到这个包
使用devtools::install_git("INBO-Natura2000/n2khelper") 安装它并寻找odbc_insert() 功能。
【讨论】: