Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

R DBI ODBC-Fehler:nanodbc/nanodbc.cpp:3110:07009:[Microsoft][ODBC-Treiber 13 für SQL Server]Ungültiger Deskriptorindex

Auch ich kämpfe seit einigen Monaten mit diesem Problem. Ich bin jedoch auf eine Lösung gestoßen, die Ihnen ebenfalls helfen könnte.

Kurz gesagt, das Problem tritt auf, wenn bestimmte Textspalten nicht nach ganzzahligen/numerischen Spalten angezeigt werden. Wenn die Spalten in der Abfrage nicht richtig ausgerichtet sind, wird ein Fehler von invalid index angezeigt wird geworfen und Ihre Verbindung kann einfrieren. Das Problem ist dann, woher weiß ich, was ich am Ende meiner Abfrage einfügen soll?

Um dies festzustellen, könnte man typischerweise eine Spalte mit class() untersuchen oder typeof() . Um solche Informationen aus der Datenbank zu untersuchen, können Sie eine Abfrage wie die folgende verwenden:

dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table")) # You may not require the schema part...

Dadurch wird eine Tabelle mit einem Typfeld für jede Spalte im interessierenden Datensatz zurückgegeben. Sie können diese Tabelle dann als Index verwenden, um select() zu sortieren Erklärung. Meine besondere Schwierigkeit besteht darin, dass der type Feld in der Tabelle waren alle Zahlen! Mir ist jedoch aufgefallen, dass jede Spalte mit einer negativen Zahl, wenn sie am Ende der select-Anweisung platziert wurde, meine Abfrage korrigierte und ich die gesamte Tabelle problemlos abrufen konnte. Zum Beispiel meine vollständige Lösung :

# Create my index of column types (ref to the current order)
index <- dbColumnInfo(dbSendQuery(con, "SELECT * from schema.table"))
index$type <- as.integer(index$type) # B/c they are + and - numbers!

# Create the ref to the table
mySQLTbl <- tbl(con, in_schema("schema", "tablename"))

# Use the select statement to put all the + numbered columns first!
mySQLTbl %>%
  select(c(which(index$type>=0),
                 which(index$type<0)))

Ich bin mir nicht sicher, warum dies auftritt, und ich habe nicht die Datenzugriffsrechte, um in meinem Anwendungsfall viel tiefer zu graben