使用RODBC进行MS-SQL批量插入

时间:2009-09-09 20:48:08

标签: sql r rodbc

是否可以使用RODBC包对MS-SQL Server(2000,2005,2008)执行批量插入?

我知道我可以使用freebcp来做到这一点,但我很好奇RODBC软件包是否实现了Microsoft SQL API的这一部分,如果没有,实现它有多困难。

6 个答案:

答案 0 :(得分:4)

查看新的odbcDBI个包。 DBI::dbWriteTable每秒写入大约20,000条记录...比RODBC::sqlSave()

中的行插入快得多

答案 1 :(得分:2)

当您设置INSERT INTO时,您可能正在寻找使用参数化Fast=True查询(在一次操作中发生)的?sqlSave

答案 2 :(得分:2)

现在,您可以使用新rsqlserver包中的dbBulkCopy

典型情况:

  1. 您创建矩阵
  2. 您将其另存为csv文件
  3. 您调用dbBulkCopy来阅读fil并使用MS Sql server的内部bcp工具插入它。
  4. 这假设您的表已在数据库中创建:

    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)
    

答案 3 :(得分:1)

从我能找到的所有内容中,没有任何解决方案可以批量插入MySQL,也没有任何与SSIS兼容的解决方案,这就是为什么微软在购买Revolution R Analytics后将SQL Server 2016纳入数据库内分析的原因。

我试图对之前的答案发表评论,但没有声誉。

rsqlserver包需要与rClr一起运行,并且这些包都不是很好,特别是因为rsqlserver的INSERT函数处理数据类型不佳。因此,如果你使用它,你将不知道你在SQL表中看到了什么,因为data.frame中的大部分信息都将被转换。

考虑到RODBC包已经存在了15年,我很失望没有人创建了批量插入函数...

答案 4 :(得分:1)

我们的n2khelper包可以使用bcp(批量复制)。当它不可用时,它会回退到多个INSERT语句。

您可以在https://github.com/INBO-Natura2000/n2khelper

上找到该套餐

使用devtools::install_git("INBO-Natura2000/n2khelper")安装它并查找odbc_insert()功能。

答案 5 :(得分:1)

使用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可以读取从