6

假设您将表存储在 SQL Server 数据库中,并且您希望执行多表操作,即连接来自同一数据库的多个表。

以下代码可以交互并从 SQL Server 接收数据:

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")

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

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

我目前的谷歌搜索技能让我得到了后端不支持多个活动结果集(MARS)的答案——我猜最多有 2 个以上的活动结果集?(后端为 DBI 和 odbc)

所以,我的问题是:如果我想从 SQL DB 的多个表中收集数据,最佳实践是什么?

  • 为每个表打开一个连接?

  • 主动关闭连接并为下一张表再次打开它?

  • 后端是否支持将 MARS 解析为连接字符串?

4

1 回答 1

3

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

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)
于 2018-01-25T11:41:03.850 回答