【问题标题】:R RODBC Show all tablesR RODBC 显示所有表格
【发布时间】:2015-07-20 16:43:39
【问题描述】:

我正在尝试使用 R/RODBC 对 MSSQL 2008 R2 数据库的结构进行编目。我已经设置了一个 DSN,通过 R 连接并使用了 sqlTables() 命令,但这只是获取“系统数据库”信息。

library(RODBC)

conn1 <- odbcConnect('my_dsn')
sqlTables(conn1)

但是,如果我这样做:

library(RODBC)

conn1 <- odbcConnect('my_dsn')
sqlQuery('USE my_db_1')
sqlTables(conn1)

我得到了与 my_db_1 数据库关联的表。有没有一种方法可以查看所有数据库和表,而无需为每个数据库和表手动输入单独的 USE 语句?

【问题讨论】:

  • 此 SQL 将为您提供所有数据库的列表:SELECT name FROM master..sysdatabases;
  • @nrussell:完美,谢谢。
  • @nrussell:你想把它放在答案中,我会选择它吗?

标签: r odbc rodbc


【解决方案1】:

可能有也可能没有更惯用的方式直接在 SQL 中执行此操作,但我们可以通过获取一个列表将来自所有数据库的所有表的数据集拼凑在一起(比重复的 USE xyz; 语句更具编程性)来自master..sysdatabases 的数据库并将这些作为catalog 参数传递给sqlTables - 例如

library(RODBC)
library(DBI)
##
tcon <- RODBC::odbcConnect(
  dsn = "my_dsn",
  uid = "my_uid",
  pwd = "my_pwd"
)
##
db_list <- RODBC::sqlQuery(
  channel = tcon,
  query = "SELECT name FROM master..sysdatabases")
##
R> RODBC::sqlTables(
    channel = tcon, 
    catalog = db_list[14, 1]
  )

(出于保密原因,我无法显示任何输出,但它会产生正确的结果。)当然,在您的情况下,您可能想要执行类似

的操作
all_metadata <- lapply(db_list$name, function(DB) {
  RODBC::sqlTables(
    channel = tcon,
    catalog = DB
  )
})
# or some more efficient variant of data.table::rbindlist...
meta_df <- do.call("rbind", all_metadata)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-15
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多