Как найти схему таблицы в соединении ODBC по имени?

Я использую пакет odbc для подключения к MS SQL Server.

con <- dbConnect(odbc::odbc(),
                 Driver   = "ODBC Driver 13 for SQL Server",
                 Server   = "server",
                 Database = "database",
                 UID      = "user",
                 PWD      = "pass",
                 Port     = 1111)

На этом сервере много таблиц, поэтому я использую dbListTables(con) для поиска тех, которые содержат определенную подстроку. Но как только я их найду, мне нужно узнать, в какой схеме они находятся, чтобы иметь возможность запрашивать их. В настоящее время я делаю это вручную (ищу имя таблицы в каждой схеме), но есть ли способ получить схему всех таблиц, соответствующих строке?


person Fino    schedule 27.03.2019    source источник


Ответы (2)


Рассмотрите возможность выполнения SQL-запроса с LIKE поиском с использованием встроенной INFORMATION_SCHEMA таблицы метаданных, если у вашего пользователя есть достаточные привилегии.

SELECT SCHEMA_NAME 
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME LIKE '%some string%'

Вызов выше с R odbc с параметризованным запросом на поиск по подстановочным знакам:

# PREPARED STATEMENT
strSQL <- paste("SELECT SCHEMA_NAME" ,                
                "FROM INFORMATION_SCHEMA.SCHEMATA",
                "WHERE SCHEMA_NAME LIKE ?SEARCH")

# SAFELY INTERPOLATED QUERY
query <- sqlInterpolate(conn, strSQL, SEARCH = '%some string%')

# DATA FRAME BUILD FROM RESULTSET
schema_names_df <- dbGetQuery(conn, query)
person Parfait    schedule 28.03.2019

Я нашел обходной путь с помощью пакета RODBC:

library('RODBC')
# First connect to the DB
dbconn <- odbcDriverConnect("driver = {ODBC Driver xx for SQL Server};
                            server = server;
                            database = database;
                            uid = username;
                            pwd = password")
# Now fetch the DB tables
sqlTables(dbconn)

Для моей конкретной БД я получаю:

names(sqlTables(dbconn)
[1] "TABLE_CAT"   "TABLE_SCHEM" "TABLE_NAME"  "TABLE_TYPE"  "REMARKS"    
person lucia.hd    schedule 27.08.2019
comment
отличный материал; каковы требования для того, чтобы это работало? (в другом месте читал, что некоторые таблицы связанных списков являются проприетарными и не индексируются, интересно, будет ли ЭТО работать здесь... или зависит ли это от индексации/some_schema_criteria/конкретного типа SQL (смотрим на подключение с использованием ODBC) спасибо - person Jonny; 11.05.2021