Я подозреваю, что это потому, что ваша таблица находится в другом каталоге или схеме.
Обоснование : 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]")
(Использование скобок с указанными идентификаторами [
и ]
часто является личным предпочтением, строго обязательным только в некоторых угловых случаях.)