Я новичок в использовании SQL Server из RStudio. Я подключен к SQL Server из RStudio, и на сервере есть несколько разных проектов, перечисленных на изображении ниже. Для этой работы я использую библиотеку odbc. Я пытаюсь получить таблицы определенного проекта (Project_3960). Я пробовал dbListTables(conn,"Project_3960"), но эта команда извлекает таблицы из всех проектов, перечисленных на рисунке ниже. Я просто хочу получить таблицу, которая указана в dbo в Project_3690.
Первое изображение из RStudio, а второе изображение из SQL Management Studio, чтобы показать структуру папок на случай выполнения SQL-запроса.
Спасибо
@ r2evans Я добавил еще одно изображение, чтобы показать структуру папок в SQL Management Studio.





Нажмите на стрелку слева от объекта dbo под Project_3690, и она должна показать вам таблицы, к которым у вас есть доступ. Если это не так, у вас проблема с правами доступа и вам нужно будет поговорить с администратором баз данных. Это позволяет вам видеть их через графический интерфейс. На самом деле, если вы еще не знаете имена таблиц, к которым вы должны получить доступ (например, следовать моему коду ниже), то это проще всего, так как они уже отфильтровывают системные и другие таблицы, которые скрывают то, что вы необходимость.
Чтобы увидеть их в коде R, dbListTables(conn) покажет вам все таблицы, в том числе только что описанные на панели «Подключения», а также множество системных и других внутренних таблиц, которые вам не нужны. В моем экземпляре SQL Server он возвращает более 600 таблиц, так что... вы можете не захотеть делать именно это, но вы можете поискать определенные таблицы.
Например, если вы знаете, что у вас должны быть таблицы Table_A и Table_B, вы можете сделать
alltables <- dbListTables(conn)
grep("table_", alltables, value = TRUE, ignore.case = TRUE)
чтобы увидеть все имена таблиц с этой строкой в имени.
Если вы не видите таблицы, к которым, как вы знаете, вам нужен доступ, вероятно, ваш код подключения не включает конкретную базу данных, и в этом случае вам нужно что-то вроде:
conn <- dbConnect(odbc(), database = "Project_3690", uid = "...", pwd = "...",
server = "...", driver = "...")
(Большинство полей уже должны быть в вашем коде подключения, не используйте литерал ... для своих строк.)
Можно использовать системную таблицу, чтобы найти другие таблицы:
DBI::dbGetQuery(conn, "select * from information_schema.tables where table_type = 'BASE TABLE' and table_schema = 'dbo'")
# TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
# 1 Project_3690 dbo Table_A BASE TABLE
# 2 Project_3690 dbo Table_B BASE TABLE
# 3 Project_3690 dbo Table_C BASE TABLE
(Условный результат, но репрезентативный, как он должен выглядеть.)
Спасибо за подробности. Да, я вижу таблицу в графическом интерфейсе, когда нажимаю раскрывающийся список dbo. Моя идея заключалась в том, чтобы получить таблицу с помощью команды, существующей в dbo. Команда, которую я выполнил ранее, возвращает мне более 500 таблиц, в которых есть другие таблицы из других проектов. Мне просто нужны таблицы из проекта_3690, которые находятся в папке dbo.
Кроме того, как вы думаете, есть ли другой способ подключиться к указанному проекту при подключении из Rstudio? В этом случае у меня будет только Project_3690, но опять же мне понадобятся таблицы из dbo, а не из других папок.
Если вы подключаетесь к database = "Project_3690", то dbo относится к таблицам, видимым для всех в этой базе данных, db_owner относится к таблицам в этой базе данных, видимым только вам (плюс-минус, немного махания рукой). В остальном это одна и та же база данных. Итак, вы упомянули «подключиться к проекту», если вы подключитесь к database = "Project_3690". Вам нужен список таблиц, который делается визуально (в графическом интерфейсе) или программно (с помощью dbListTables(conn)).
Но есть ли какая-нибудь команда, которая может фильтровать все таблицы напрямую из dbo?
Попробуйте запрос: DBI::dbGetQuery(conn, "select * from information_schema.tables where table_type = 'BASE TABLE' and table_schema = 'dbo'")
Я попробовал вышеуказанный запрос, и он говорит Invalid Object name information_schemea.tables
Опечатка, ваш information_schemea должен быть information_schema
Это говорит о том, что операторы не могут быть подготовлены, но я могу получить одну таблицу, используя dbGetQuery(conn, "select * from project_3690.dbo.AE_ISD ")
«Отчеты не могут быть подготовлены» звучит так, как будто это другая схема. Вместо этого вы можете попробовать "select * from sys.tables", хотя я недостаточно знаком с этим, чтобы знать, есть ли известные «различия» между ними. (Однако в нем все равно что-то должно быть указано.) Несмотря на это, похоже, что вы работаете со своим запросом project_3690.dbo.AE_ISD, удачи!
Не совсем правильно извлекать данные с SQL-сервера с помощью RStudio, когда у вас разные схемы и все они подключены к серверу. Подключенные базы данных со схемой легко просматривать в SQL Server Management Studio, но не в RStudio. Самый простой способ при использовании Rodbc — использовать оператор точки (.), а легко получить таблицы конкретной базы данных с помощью «.» с функцией dbGetQuery. Я попробовал dbGetQuery(conn, "select * from project_3690.dbo.AE_ISD "), и это работает отлично.
dbListTablesпо определению и назначению возвращает все имена таблиц, найденных на сервере в пределах (единственной!) подключенной базы данных; на самом деле ему нужен только один аргумент, объект подключения (вашconn). Если вам нужно подключиться к другой базе данных, это следует решить, когда вы определяетеconn, как вdbConnect(..., database = "Project_3960")или подобном.