Получить конкретный проект БД и его таблицы из SQL Server в R

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

Первое изображение из RStudio, а второе изображение из SQL Management Studio, чтобы показать структуру папок на случай выполнения SQL-запроса.

Спасибо

dbListTables по определению и назначению возвращает все имена таблиц, найденных на сервере в пределах (единственной!) подключенной базы данных; на самом деле ему нужен только один аргумент, объект подключения (ваш conn). Если вам нужно подключиться к другой базе данных, это следует решить, когда вы определяете conn, как в dbConnect(..., database = "Project_3960") или подобном.
r2evans 15.09.2022 18:09

@ r2evans Я добавил еще одно изображение, чтобы показать структуру папок в SQL Management Studio.

Usman YousafZai 16.09.2022 10:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Нажмите на стрелку слева от объекта 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.

Usman YousafZai 15.09.2022 21:55

Кроме того, как вы думаете, есть ли другой способ подключиться к указанному проекту при подключении из Rstudio? В этом случае у меня будет только Project_3690, но опять же мне понадобятся таблицы из dbo, а не из других папок.

Usman YousafZai 15.09.2022 21:57

Если вы подключаетесь к database = "Project_3690", то dbo относится к таблицам, видимым для всех в этой базе данных, db_owner относится к таблицам в этой базе данных, видимым только вам (плюс-минус, немного махания рукой). В остальном это одна и та же база данных. Итак, вы упомянули «подключиться к проекту», если вы подключитесь к database = "Project_3690". Вам нужен список таблиц, который делается визуально (в графическом интерфейсе) или программно (с помощью dbListTables(conn)).

r2evans 15.09.2022 22:03

Но есть ли какая-нибудь команда, которая может фильтровать все таблицы напрямую из dbo?

Usman YousafZai 15.09.2022 22:05

Попробуйте запрос: DBI::dbGetQuery(conn, "select * from information_schema.tables where table_type = 'BASE TABLE' and table_schema = 'dbo'")

r2evans 15.09.2022 22:08

Я попробовал вышеуказанный запрос, и он говорит Invalid Object name information_schemea.tables

Usman YousafZai 16.09.2022 10:14

Опечатка, ваш information_schemea должен быть information_schema

r2evans 16.09.2022 14:14

Это говорит о том, что операторы не могут быть подготовлены, но я могу получить одну таблицу, используя dbGetQuery(conn, "select * from project_3690.dbo.AE_ISD ")

Usman YousafZai 16.09.2022 15:36

«Отчеты не могут быть подготовлены» звучит так, как будто это другая схема. Вместо этого вы можете попробовать "select * from sys.tables", хотя я недостаточно знаком с этим, чтобы знать, есть ли известные «различия» между ними. (Однако в нем все равно что-то должно быть указано.) Несмотря на это, похоже, что вы работаете со своим запросом project_3690.dbo.AE_ISD, удачи!

r2evans 16.09.2022 15:51
Ответ принят как подходящий

Не совсем правильно извлекать данные с SQL-сервера с помощью RStudio, когда у вас разные схемы и все они подключены к серверу. Подключенные базы данных со схемой легко просматривать в SQL Server Management Studio, но не в RStudio. Самый простой способ при использовании Rodbc — использовать оператор точки (.), а легко получить таблицы конкретной базы данных с помощью «.» с функцией dbGetQuery. Я попробовал dbGetQuery(conn, "select * from project_3690.dbo.AE_ISD "), и это работает отлично.

Другие вопросы по теме