Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Errore ODBC DBI R:nanodbc/nanodbc.cpp:3110:07009:[Microsoft][Driver ODBC 13 per SQL Server]Indice descrittore non valido

Anche io ho lottato con questo problema per diversi mesi. Tuttavia, ho trovato una soluzione che potrebbe aiutare anche te.

In poche parole, il problema si verifica quando alcune colonne di testo non vengono visualizzate dopo colonne intere/numeriche. Quando le colonne non sono allineate correttamente nella query, viene visualizzato un errore di invalid index viene lanciato e la tua connessione potrebbe bloccarsi. Il problema quindi è:come faccio a sapere cosa mettere alla fine della mia query?

Per determinarlo, in genere si può esaminare una colonna usando class() o typeof() . Per esaminare tali informazioni dal database, puoi utilizzare una query come:

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

Ciò restituirà una tabella con un campo tipo per ogni colonna nel set di dati di interesse. Puoi quindi utilizzare questa tabella come indice per ordinare select() dichiarazione. La mia difficoltà particolare è che il type il campo nella tabella era tutti i numeri! Tuttavia, ho notato che ogni colonna con un numero negativo, se posizionata alla fine dell'istruzione select, ha corretto la mia query e ho potuto estrarre l'intera tabella correttamente. Ad esempio, la mia soluzione completa :

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

Per quanto riguarda il motivo per cui ciò si verifica, non sono sicuro e non ho i privilegi di accesso ai dati per scavare molto più a fondo nel mio caso d'uso