从 MS SQL 2012 odbc 连接读取 table 时描述符索引无效

Invalid Descriptor Index when reading table from MS SQL 2012 odbc connection

我已经使用 enterprise archiect 创建了一个 MS SQL 2012 数据库,我正在使用 R 和 dbiodbc 包将数据上传到该服务器。现在,我在从我的 MS SQL 2012 服务器读取 table 时遇到问题,我需要与另一个具有 FK 约束的 table 合并 table。令我沮丧的是,我可以下载空 table,但不能下载我之前附加的填充 table。

这是 EA 数据库建模的图片:

有一个主要 table "unternehmen" 包含有关公司的信息,该 table "eigentumsverhaeltnisse" 包含更多信息,其中一个信息是 link编辑到包含此信息标签的元 table "eigentuemer"。 (我不一定需要这个,但其他地方也有类似情况)。整个数据库(大约 100 tables)是使用企业架构师的 DDL 生成创建的。如果需要,我可以添加更多相关信息。

所以我手动创建了 meta table 并使用以下代码将其上传到服务器:

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)

创建辅助 table 的代码有点多,然后我在从 SQL 服务器加载元 table 以包含 FK 后将其与元 table 合并。然后也使用与上面相同的代码上传。

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)

现在我无法重新加载之前附加的 table,这真的很令人沮丧,当 table 为空时我可以使用相同的命令。

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 表示无效的描述符索引。 table 存在

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

类似的问题有: Import Tables from SQL Server into R

编辑回答评论:我不太明白 link 的问题。我没有 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]")

所以只是为了关闭这个:

与@Hearkz指出的问题有关 https://github.com/r-dbi/odbc/issues/10 这也涉及到 ntext 和 text 变量,所以我需要将这些变量调整为 nvarchar(veryhighnumber) 而不是 nvarchar(MAX)。