R RODBC显示所有表格

scr*_*Owl 5 odbc r rodbc

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

library(RODBC)

conn1 <- odbcConnect('my_dsn')
sqlTables(conn1)
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做:

library(RODBC)

conn1 <- odbcConnect('my_dsn')
sqlQuery('USE my_db_1')
sqlTables(conn1)
Run Code Online (Sandbox Code Playgroud)

我得到了与my_db_1数据库相关联的表.有没有办法查看所有数据库和表,而无需为每个数据库和表单独输入单独的USE语句?

nru*_*ell 5

可能有也可能没有更惯用的方法来直接在 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]
  )
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)