dbReadTable не будет извлекать данные, но dbListFields увидит правильные поля - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь получить данные из базы данных SQL, к которой у меня есть доступ. Я могу подключиться к базе данных, просмотреть таблицы и получить поля, связанные с данной таблицей, но не могу прочитать таблицу в переменную R.

Я работаю в R Studio, если это имеет значение.

Я пытался использовать онлайн-фрагменты кода (новичок в R) и эти работы, за исключением примеров dbReadTable (). Я использовал и «Платежи», и имя = «Платежи» в качестве второго аргумента, и оба с кавычками и без них.

library(DBI)
con<-(dbConnect(odbc::odbc(), .connection_string="Driver={SQL Server},
Server=example_1234
Database=exampleDB
TrustedConnection=TRUE")

testing123 <- dbListFields(con,"Payments")
testing456 <- dbReadTable(con,"Payments")

Я ожидаю подключения к базе данных, которая теперь называется con. Это работает. Я ожидаю, что тестирование123 будет содержать все поля в разделе «Платежи». Это тоже работает. Я ожидаю, что тестирование 456 будет копией платежей в формате data.frame. Это приводит к: Ошибка: «SELECT * FROM« Платежи »nanodbc / nanobdc.cpp: 1587 42s02 [Microsoft] [Драйвер ODBC SQL SERVER] [SQL SERVER] Неверное имя объекта« Платежи ».

Это немного отличается без«Платежи» в качестве аргумента - просто сказать «Объект« Платежи »не найден».

Любая помощь высоко ценится.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Я подозреваю, что это потому, что ваша таблица находится в другом каталоге или схеме.

Обоснование : DBI::dbListFields выполняет select * from ... limit 0 (что не является правильным синтаксисом для сервера SQL), но odbc::dbListFields действительно вызывает функцию C ++ connection_sql_columns, специфичную для SQL Server. Возможно, он позволяет вам быть неаккуратным в том, что он найдет таблицу, даже если вы не указали каталог и / или схему. Вот почему ваш dbListFields работает. Однако , DBI::dbReadTable действительно делает select * from ... под капотом (и odbc:: не переопределяет его), поэтому он не позволяет опустить схему (и / или каталог).

Сначала найдите конкретную информацию таблицы для вашего случая:

DBI::dbGetQuery(con, "select top 1 table_catalog, table_schema, table_name, column_name from information_schema.columns where table_name='events'")
#   table_catalog table_schema table_name column_name
# 1    my_catalog          dbo   Payments          Id

(я проецирую то, что вы найдете.)

Отсюда попробуйте одно из следующихпока это не работает:

x <- DBI::dbReadTable(con, DBI::SQL("[Payments]")) # equivalent to the original
x <- DBI::dbReadTable(con, DBI::SQL("[dbo].[Payments]"))
x <- DBI::dbReadTable(con, DBI::SQL("[my_catalog].[dbo].[Payments]"))

Я предполагаю, что DBI::dbGetQuery(con, "select top 1 * from Payments") не будет работать, поэтому для «обычных запросов» вам нужно будет использовать ту же иерархию catalog.schema.table, например, одну из

DBI::dbGetQuery(con, "select top 1 * from dbo.Payments")
DBI::dbGetQuery(con, "select top 1 * from [dbo].[Payments]")
DBI::dbGetQuery(con, "select top 1 * from [my_catalog].[dbo].[Payments]")

(Использование скобок с указанными идентификаторами [ и ] часто является личным предпочтением, строго обязательным только в некоторых угловых случаях.)

0 голосов
/ 08 октября 2019

Попробуйте немного изменить аргумент "против":

con <- DBI::dbConnect(odbc::odbc(),
    Driver = "SQL Server",
    Server = "example_1234",
    Database = "exampleDB",
    TrustedConnection = TRUE)

# read table to df
testing456 <- dbReadTable(con,"Payments")

# you can also use SQL queries directly, such as:
testing789 <- dbGetQuery(con, statement = "SELECT * FROM Payments WHERE ...")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...