2015-07-20 67 views
4

我在尝试使用R/RODBC对MSSQL 2008 R2数据库的结构进行编目。我建立了一个DSN,通过R连接并使用了sqlTables()命令,但这只是获取'系统数据库'信息。R RODBC显示所有表格

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语句?

+1

这个SQL会给你一个所有数据库的列表:'SELECT name FROM master..sysdatabases;' – nrussell

+1

@nrussell:完美,谢谢。 – screechOwl

+0

@nrussell:你想把它放在答案中,我会选择它? – screechOwl

回答

3

可能有也可能没有更直接的方法来直接在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)