sql-server - R:最佳实践 - dplyr 和 odbc 多表操作(从 SQL 检索)

标签 sql-server r dplyr odbc dbplyr

假设您将表存储在 SQL 服务器数据库中,并且您想要执行多表操作,即连接来自同一数据库的多个表。

以下代码可以交互并从 SQL 服务器接收数据:

library(dplyr)
library(odbc)
con <- dbConnect(odbc::odbc(),
                 .connection_string = "Driver={SQL Server};Server=.;Database=My_DB;")

Table1 <- tbl(con, "Table1")
Table1 # View glimpse of Table1

Table2 <- tbl(con, "Table2")
Table2 # View glimpse of Table2

Table3 <- tbl(con, "Table3")

但是,使用 检索到的一些结果同 连接,最终出现以下错误:

Error: [Microsoft][ODBC SQL Server Driver]Connection is busy with results for another hstmt



我目前的谷歌搜索技能让我得到了后端不支持多个事件结果集 (MARS) 的答案——我猜超过 2 个事件结果集是最大值? (后端是 DBI 和 odbc)

所以,我的问题是:如果我想从 SQL DB 的多个表中收集数据,最佳实践是什么?
  • 为每个表打开一个连接?
  • 主动关闭连接并为下一个表再次打开它?
  • 后端是否支持将MARS解析为连接字符串?
  • 最佳答案

    为了建立一个可以容纳多个结果集的连接,我很幸运地使用了以下连接代码:

    con <- DBI::dbConnect(odbc::odbc(),
                          Driver = "SQL Server Native Client 11.0",
                          Server = "my_host",
                          UID = rstudioapi::askForPassword("Database UID"),
                          PWD = rstudioapi::askForPassword("Database PWD"),
                          Port = 1433,
                          MultipleActiveResultSets = "True",
                          Database = my_db)
    

    最重要的是,我发现新的 pool -package 可以完成这项工作:
    pool <- dbPool(odbc::odbc(),
                          Driver = "SQL Server Native Client 11.0",
                          Server = "my_host",
                          UID = rstudioapi::askForPassword("Database UID"),
                          PWD = rstudioapi::askForPassword("Database PWD"),
                          Port = 1433,
                          MultipleActiveResultSets = "True",
                          Database = my_db)
    

    它比 DBI 连接更快、更稳定,但是,一个小缺点是数据库不会在连接选项卡中弹出以供引用。

    对于这两种方法,请记住在完成后关闭连接/池。对于 DBI 方法,其:
    dbDisconnect(con)
    

    而池方法通过调用关闭:
    poolClose(pool)
    

    关于sql-server - R:最佳实践 - dplyr 和 odbc 多表操作(从 SQL 检索),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48417212/

    相关文章:

    sql-server - 这个 OpenXML 有什么问题?

    sql - 两列的总和,并按另一列进行连接和分组

    sql-server - 如何确定某列是否在其表的主键中? (SQL 服务器)

    r - 润滑不匹配的索引类

    r - R的randomForest包中缺失值错误

    r - 不使用 "for"两个数据帧之间的多重比较

    r - 使用正则表达式有条件地过滤多列以选择colnames R

    sql - sql 中的默认约束为 NULL NOT NULL

    r - 对重复行施加限制

    r - group_by 和 pmap 对每组的每一行进行分段操作(ifelse 与 case_when)