我正在尝试使用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语句?
答案 0 :(得分:4)
在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)