R RODBC 显示所有表

R RODBC Show all tables

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

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 中可能有也可能没有更惯用的方法来直接执行此操作,但我们可以将所有数据库中所有表的数据集拼凑在一起(比重复 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)