Индекс недопустимого дескриптора при чтении таблицы из соединения MS SQL 2012 odb c - PullRequest
0 голосов
/ 15 апреля 2020

Я создал базу данных MS SQL 2012, используя архитектуру предприятия, и сейчас я загружаю данные на этот сервер, используя R и пакеты dbi и odbc. Теперь у меня проблема с чтением таблицы из моего сервера MS SQL 2012, которую мне нужно объединить с другой таблицей, имеющей ограничение FK для этой таблицы. Что меня расстраивает, так это то, что я могу загрузить пустую таблицу, но не заполненную таблицу, которую я добавил ранее.

Вот изображение моделирования базы данных EA: enter image description here

Существует главная таблица "unternehmen" с информацией о фирмах, которая ведет к дополнительной таблице "eigentumsverhaeltnisse" с дополнительной информацией, а одна информация связана с мета-таблицей "eigentuemer", содержащей метки этой информации. (Мне это не обязательно нужно, но в других местах есть подобные ситуации). Вся база данных (примерно 100 таблиц) создается с использованием DDL-поколения корпоративного архитектора. Я мог бы добавить больше информации об этом, если это необходимо.

Итак, я создал мета-таблицу вручную и загрузил ее на сервер с помощью этого кода:

con <- DBI::dbConnect(odbc::odbc(),
                      Driver = "SQL Server",
                      Server = "MY server", 
                      Database = "EA_DB",
                      encoding = "latin1")
df_temp<-data.table(bezeichnung=c("Land", … , "Staat"))
DBI::dbWriteTable(con, “eigentuemer”, df_temp, append=TRUE)

Для создания вторичной таблицы есть немного больше кода, который я затем объединю с после загрузки с сервера SQL в таблицу метаданных включается FK. Затем он также загружается с использованием того же кода, что и выше.

df_temp <- code to create the other table 
df_temp_sql<-DBI::dbReadTable(con, “eigentuemer”)
df_temp<-merge(df_temp,df_temp_sql,by="bezeichnung")
some other code
DBI::dbWriteTable(con, “eigentumsverhaeltnisse“, df_temp, append=TRUE)

enter image description here

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

df_temp_sql<-DBI::dbReadTable(con, “eigentumsverhaeltnisse“,)
Error in result_fetch(res@ptr, n) : 
  nanodbc/nanodbc.cpp:2966: 07009: [Microsoft][ODBC SQL Server Driver]Ungültiger Deskriptorindex 

Я предполагаю, что «ungültiger Deskriptorindex означает недопустимый индекс дескриптора. Таблица существует

DBI::dbExistsTable(con, "eigentumsverhaeltnisse")

Я нашел похожие вопросы, но я не нашел решения для меня, я попробовал другие

df_temp_sql_4<-DBI::dbReadTable(con,DBI::SQL("eigentumsverhaeltnisse"))
df_temp_sql_5<-DBI::dbReadTable(con,"dbo.eigentumsverhaeltnisse")
df_temp_sql_6<-DBI::dbReadTable(con,DBI::SQL("dbo.eigentumsverhaeltnisse"))

Я также попробовал dgGetQuery, но получаю ту же ошибку

Bin <- DBI::dbGetQuery(con, "SELECT [id], [konzernname], [eigentuemer_id], [eigentuemer_andere], 
                          [weitere_geschaeftsfelder], [konzernteil] FROM [EA_DB].[dbo].[eigentumsverhaeltnisse]")
Error in result_fetch(res@ptr, n) : 
      nanodbc/nanodbc.cpp:2966: 07009: [Microsoft][ODBC SQL Server Driver]Ungültiger Deskriptorindex

Подобные вопросы: Импорт таблиц из SQL Сервер в R Ошибка dbReadTable в R: неверное имя объекта Ошибка dbReadTable в R: неверный объект имя

Изменить, чтобы ответить на комментарий: Я не совсем понимаю вопрос по ссылке. У меня нет переменных varchar (max) или varbinary (max), не так ли? У меня

PK id:bigint
   konzername:ntext
FK eigentuemer_id:bigint
   eigentuemer_andere:ntext
   weitere_geschaftsfelder:bit
   konzernteil:bit

Что странно, так это то, что некоторые команды DBI::dbGetQuery работают, когда я включаю только подмножество столбцов, а некоторые нет.

#Works
Bin <- DBI::dbGetQuery(con, "SELECT [id], [konzernname], [eigentuemer_andere] FROM [EA_DB].[dbo].[eigentumsverhaeltnisse]")
head(Bin)
#works as well
Bin <- DBI::dbGetQuery(con, "SELECT [id],  [eigentuemer_id] FROM [EA_DB].[dbo].[eigentumsverhaeltnisse]")
head(Bin)
#Does not work 
Bin <- DBI::dbGetQuery(con, "SELECT [id], [konzernname], [eigentuemer_andere], [eigentuemer_id] FROM [EA_DB].[dbo].[eigentumsverhaeltnisse]")
#works as well
Bin <- DBI::dbGetQuery(con, "SELECT [id],  [weitere_geschaeftsfelder] FROM [EA_DB].[dbo].[eigentumsverhaeltnisse]")
head(Bin)
#Does not work
Bin <- DBI::dbGetQuery(con, "SELECT [id], [konzernname], [eigentuemer_andere], [weitere_geschaeftsfelder] FROM [EA_DB].[dbo].[eigentumsverhaeltnisse]")

1 Ответ

0 голосов
/ 17 апреля 2020

Так что просто чтобы закрыть это:

относится к isseu, указанному @Hearkz https://github.com/r-dbi/odbc/issues/10, который также относится к ntext и текстовым переменным, так что мне нужно измените эти переменные на nvarchar (очень большое число) вместо nvarchar (MAX).

...