Ошибка dbReadTable в R: недопустимое имя объекта

Я прочесывал stackoverflow и google в течение часа, пытаясь понять, почему моя таблица не отображается. До сих пор решения, которые работали для других, не работали для меня.

Я подключаюсь к базе данных следующим образом:

library(DBI)
library(dplyr)
con <- dbConnect(odbc::odbc(), .connection_string = "Driver={SQL Server};", 
                 user = rstudioapi::askForPassword("Your computer usename e.g. SmithJo"), 
                 password = rstudioapi::askForPassword("Your computer password (e.g. to login to Windows)"), 
                 port = 1433, 
                server = "myserver", 
                dbname = "MYDB")

Подключение к некоторым таблицам работает:

traptable <- dbReadTable(con, "tblTrap")

А другие нет, даже несмотря на то, что таблица существует!

> dbExistsTable(con, "tlkpSampleType")
[1] TRUE

Я включил некоторые из решений, которые я пробовал...

> dbReadTable(con, "tlkpSampleType")
Error: <SQL> 'SELECT * FROM "tlkpSampleType"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'tlkpSampleType'. 
> dbReadTable(con, SQL("tlkpSampleType"))
Error: <SQL> 'SELECT * FROM tlkpSampleType'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'tlkpSampleType'. 
> dbGetQuery(con, "SELECT * FROM tlkpSampleStatus")
Error: <SQL> 'SELECT * FROM tlkpSampleStatus'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'tlkpSampleStatus'. 
> dbReadTable(con,"MYDB.tlkpSampleStatus")
Error: <SQL> 'SELECT * FROM "MYDB.tlkpSampleStatus"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'MYDB.tlkpSampleStatus'. 
> queryResults <- dbGetQuery(con, "SELECT * FROM [MYDB].[abc].[tlkpSampleStatus]")
Error: <SQL> 'SELECT * FROM [MYDB].[abc].[tlkpSampleStatus]'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'MYDB.abc.tlkpSampleStatus'. 
> dbReadTable(con, Id(schema = "tlkpSampleStatus"))
Error: <SQL> 'SELECT * FROM "tlkpSampleStatus"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'tlkpSampleStatus'. 
> dbReadTable(con, Id(schema = "MYDB", table = "tlkpSampleStatus"))
Error: <SQL> 'SELECT * FROM "MYDB"."tlkpSampleStatus"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'MYDB.tlkpSampleStatus'. 
> dbGetQuery(con, paste('SELECT * FROM', 'tlkpSampleStatus'))
Error: <SQL> 'SELECT * FROM tlkpSampleStatus'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'tlkpSampleStatus'. 
> dbReadTable(con, Id(schema = "tlkpSampleStatus", table = "tlkpSampleStatus"))
Error: <SQL> 'SELECT * FROM "tlkpSampleStatus"."tlkpSampleStatus"'
  nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'tlkpSampleStatus.tlkpSampleStatus'. 

person Nova    schedule 06.09.2018    source источник
comment
Я не могу воспроизвести это. В настоящее время я использую odbc-1.1.6 с DBI-1.0.0 на R-3.5.1 (x86_64-w64-mingw32). Мой сервер Microsoft SQL Server 2017 (RTM-CU9-GDR) (KB4293805) - 14.0.3035.2 (X64) (от select @@version). Драйвер ODBC, который я использую, - это SQL Server (потому что новые драйверы ломаются по-новому). Если у вас есть различия в версиях, это может указывать на то, в чем заключаются проблемы. Если это так, это может быть достойным отчета об ошибке для конкретного пакета (или вам и мне нужно определить, какие другие изменения привносит новая версия).   -  person r2evans    schedule 07.09.2018
comment
Я считаю, что мой SQL Server 2012 года. Я проверю свои другие пакеты, когда вернусь к работе. Спасибо за вашу поддержку.   -  person Nova    schedule 07.09.2018


Ответы (3)


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

>dbReadTable(con, SQL("dbo.tlkpSampleType"))

Чтобы увидеть полный список таблиц и их схем, вы можете сделать что-то вроде:

1  rs <- dbSendQuery(con, "SELECT SCHEMA_NAME(schema_id) As SchemaName, name As TableName FROM sys.tables;")
2  dbFetch(rs)

Оттуда вы можете соответствующим образом квалифицировать таблицы для будущих запросов.

person Sturgus    schedule 10.09.2018
comment
Спасибо @Sturgus! @ r2evans, затем я смог загрузить таблицу, вызвав samptable<-dbGetQuery(con, "SELECT * FROM AdminOnly.tlkpSampleStatus"). - person Nova; 10.09.2018

Та же проблема здесь. Я узнал, что это связано со схемой таблицы. Вы можете перечислить схему, сначала настроив канал:

ch = odbcDriverConnect(DSM, Uid, Pwd) 

Затем запустите:

tables = sqlTables(ch)

Я обнаружил, что могу читать таблицы со схемой dbo, но не sys.

person Vincent Mullers    schedule 07.09.2018
comment
Я не могу найти sqlTables ни в DBI, ни в odbc; он экспортируется RODBC, который отличается от среды OP. Вы предлагаете подключиться к серверу MS SQL с помощью RODBC и (также) не иметь проблемы с OP? - person r2evans; 07.09.2018
comment
Правда, мне не удалось отобразить схемы таблиц, используя какие-либо функции внутри DBI или odbc, поэтому я настроил соединение через RODBC и запустил sqlTables. Я только что решил проблему, изменив схему таблицы, которую я хотел получить, на dbo. Теперь я могу импортировать таблицу без ошибок. Я предполагаю, что у traptable есть схема dbo, но у tlkpSampleType нет. - person Vincent Mullers; 07.09.2018
comment
Так же, как важно предоставить воспроизводимый вопрос, еще более важно, чтобы предлагаемое решение было самодостаточным ответом. . В этом случае важно быть предельно ясным и заявить, что вы полностью меняете методологию подключения. Различий между пакетами на основе DBI и RODBC примерно столько же, сколько и сходства, что не является таким уж тривиальным изменением. Ваш комментарий о том, что вы не входите в схему dbo, возможно, является тем, где будет найдено решение, возможно, Nova найдет способ определить это. - person r2evans; 07.09.2018
comment
Просто для ясности: он работает как для подключений DBI, так и для подключений RODBC, которые я установил. В этом случае я просто установил соединение RODBC, чтобы проверить схему таблиц в базе данных. Я не нашел в пакете DBI функции, отображающей схему для каждой таблицы, поэтому для этого пришлось прибегнуть к RODBC. В любом случае, я надеюсь, что просмотр схем поможет Nova определить проблему. - person Vincent Mullers; 07.09.2018
comment
Хорошо, мне не сразу было ясно, что вы подтвердили с помощью DBI, что таблицы в другой схеме не были перечислены, и они были перечислены при попытке с RODBC, теперь я это вижу. Специфичный для mssql метод определения схемы таблицы — с select * from INFORMATION_SCHEMA.COLUMNS и Я упоминал об этом в предыдущем вопросе OP (о котором вы, возможно, не знали). - person r2evans; 07.09.2018
comment
Спасибо всем. Мой коллега, который поддерживает базу данных, сегодня отсутствует, поэтому я надеюсь спросить его об этом в понедельник. Я дам вам знать, что я узнаю. - person Nova; 07.09.2018

Пакет dbplyr позволяет вам выбрать, какую схему использовать с функцией in_schema. Это должно делать свое дело.

library(dbplyr)
con_tlkpSampleStatus <- tbl(con, in_schema("abc", "tlkpSampleStatus"))
person Richard van der Pool    schedule 02.12.2019