【问题标题】:MS-SQL Bulk Insert with RODBC使用 RODBC 的 MS-SQL 批量插入
【发布时间】:2010-11-26 23:36:53
【问题描述】:

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

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

【问题讨论】:

    标签: sql r rodbc


    【解决方案1】:

    查看新的 odbcDBI 软件包。 DBI::dbWriteTable 每秒写入大约 20,000 条记录...比 RODBC::sqlSave() 的 Row Inserts 快得多

    【讨论】:

    • 我无法安装odbc,它会产生错误:ERROR: lazy loading failed for package 'blob'
    • 这听起来需要一个不同的问题
    【解决方案2】:

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

    【讨论】:

    • 不,sqlSave 将执行多个 INSERTS。我想要一个单笔交易的 BULK INSERT。
    • fast=true 不作为单个事务执行吗?
    • 来自 rodbc 文档:“逻辑。如果为 false,则一次写入一行数据。如果为 true,则使用参数化的 INSERT INTO 或 UPDATE 查询在一个操作中写入所有数据。”..但是它似乎没有任何区别(在我的情况下写给 Netezza 时)
    • 根据我的经验,恐怕设置 fast = T 或 fast = F 不会改变任何事情。无论如何,记录都会被一一插入。至少在我使用 SQL Server 2012 的情况下。
    • 对我来说,fast = TRUE,使 sqlSave 函数快了约 3 倍。同样在 sql server 2012 上。
    【解决方案3】:

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

    一个典型的场景:

    1. 你创建一个矩阵
    2. 您将其保存为 csv 文件
    3. 您调用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)
    

    【讨论】:

    • rsqlserver 不在 cran 上的任何原因?
    • @MusX 因为它正在开发中(特别是文档和测试部分)并且它使用了不在 CRAN 上的 rClr 包。但是我们鼓励您从 GITHUB 使用它,并且会很高兴收到任何反馈。
    【解决方案4】:

    使用 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 可以读取来自。

    【讨论】:

      【解决方案5】:

      从我所能找到的一切来看,没有批量插入 MySQL 的解决方案,也没有任何适用于 SSIS 的解决方案,这就是为什么微软在购买 Revolution R Analytics 后将数据库内分析与 SQL Server 2016 结合起来的原因。

      我试图对上一个答案发表评论,但没有这样做的声誉。

      rsqlserver 包需要与rClr 一起运行,并且这些包都不是正常的,尤其是因为rsqlserver 的 INSERT 函数的数据类型处理能力很差。因此,如果您使用它,您将不知道您在 SQL 表中查看的是什么,因为您的 data.frame 中的大部分信息都将被转换。

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

      【讨论】:

      • 关于 rsqlserver 的重要一点,但对于我们中的许多人来说,我们不需要“查看”数据(从 R 的角度来看)。如果它是在 R 中建模、成形和处理的,我们只需要将结果返回到数据库中,R 将类型转换为数据库中的什么并不重要(只要它们是合理的并且可以被其他系统读取)
      • @Joe 我不认为我会雇用说“我们不需要'查看'数据”的人。
      【解决方案6】:

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

      你可以在https://github.com/INBO-Natura2000/n2khelper找到这个包

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

      【讨论】:

        猜你喜欢
        • 2016-01-31
        • 1970-01-01
        • 2015-06-20
        • 1970-01-01
        相关资源
        最近更新 更多