Passare variabile R per sqlquery di RODBC? [duplicare]
Domanda
Questa domanda ha già una risposta qui:
C'è un modo per passare una variabile definita all'interno R al sqlquery all'interno del pacchetto RODBC?
In particolare, ho bisogno di passare un tale variabile, o un / funzione con valori di tabella scalare, una stored procedure, e / o forse la clausola WHERE di un'istruzione SELECT.
Ad esempio, lasciare che:
x <- 1 ## user-defined
Poi,
example <- sqlQuery(myDB,"SELECT * FROM dbo.my_table_fn (x)")
Oppure ...
example2 <- sqlQuery(myDB,"SELECT * FROM dbo.some_random_table AS foo WHERE foo.ID = x")
Oppure ...
example3 <- sqlQuery(myDB,"EXEC dbo.my_stored_proc (x)")
Ovviamente, nessuno di questi lavori, ma sto pensando che c'è qualcosa che consente questo tipo di funzionalità.
Soluzione
Crea la stringa che si intende passare. Così, invece di
example <- sqlQuery(myDB,"SELECT * FROM dbo.my_table_fn (x)")
do
example <- sqlQuery(myDB, paste("SELECT * FROM dbo.my_table_fn (",
x, ")", sep=""))
che compilare il valore della x
.
Altri suggerimenti
Se si usa sprintf, si può facilmente costruire la stringa di query utilizzando la sostituzione di variabile. Per facilità d'uso-extra, se si pre-parse che query string (sto usando stringr) si può scrivere su più righe nel codice.
per es.
q1 <- sprintf("
SELECT basketid, count(%s)
FROM %s
GROUP BY basketid
"
,item_barcode
,dbo.sales
)
q1 <- str_replace_all(str_replace_all(q1,"\n",""),"\\s+"," ")
df <- sqlQuery(shopping_database, q1)
Side-nota e cappello-punta ad un altro R cap
Di recente ho scoperto che volevo fare la sostituzione di variabile ancora più semplice utilizzando qualcosa di simile function () String.Format di Python, che consente di riutilizzare e le variabili di riordino all'interno della stringa
per es.
$: w = "He{0}{0}{1} W{1}r{0}d".format("l","o")
$: print(w)
"Hello World"
Tuttavia, questa funzione non sembra esistere in R, così ho chiesto in giro su Twitter, e un tipo molto utile @kevin_ushey rispose con la sua funzione personalizzata da utilizzare in R. Controllare esso fuori!
prova con questo
x <- 1
example2 <- fn$sqlQuery(myDB,"SELECT * FROM dbo.some_random_table AS foo WHERE foo.ID = '$x'")
Con più variabili fare questo:
aaa <- "
SELECT ColOne, ColTwo
FROM TheTable
WHERE HpId = AAAA and
VariableId = BBBB and
convert (date,date ) < 'CCCC'
"
--------------------------
aaa <- gsub ("AAAA", toString(111),aaa)
aaa <- gsub ("BBBB", toString(2222),aaa)
aaa <- gsub ("CCCC", toString (2016-01-01) ,aaa)