Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Erreur R DBI ODBC :nanodbc/nanodbc.cpp:3110 : 07009 :[Microsoft][ODBC Driver 13 for SQL Server]Index de descripteur non valide

Moi aussi j'ai du mal avec ce problème depuis plusieurs mois. Cependant, j'ai trouvé une solution qui pourrait également vous aider.

En un mot, le problème se produit lorsque certaines colonnes de texte n'apparaissent pas après les colonnes entières/numériques. Lorsque les colonnes ne sont pas alignées correctement dans la requête, une erreur de invalid index est lancé et votre connexion peut se bloquer. Le problème est alors :comment savoir quoi mettre à la fin de ma requête ?

Pour le déterminer, on peut généralement examiner une colonne en utilisant class() ou typeof() . Pour examiner ces informations à partir de la base de données, vous pouvez utiliser une requête telle que :

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

Cela renverra une table avec un champ de type pour chaque colonne de l'ensemble de données d'intérêt. Vous pouvez ensuite utiliser cette table comme index pour trier les select() déclaration. Ma difficulté particulière est que le type champ dans la table était tous les nombres! Cependant, j'ai remarqué que chaque colonne avec un nombre négatif, lorsqu'elle était placée à la fin de l'instruction select, corrigeait ma requête et je pouvais très bien extraire toute la table. Par exemple, ma ​​solution complète :

# 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)))

Quant à la raison pour laquelle cela se produit, je ne suis pas sûr et je n'ai pas les privilèges d'accès aux données pour creuser beaucoup plus profondément dans mon cas d'utilisation