2015-07-20 73 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)