Передать переменную R в sqlQuery RODBC?

Есть ли способ передать переменную, определенную в R, функции sqlQuery в пакете RODBC?

В частности, мне нужно передать такую ​​переменную скалярной/табличной функции, хранимой процедуре и/или, возможно, предложению WHERE оператора SELECT.

Например, пусть:

x <- 1 ## user-defined

Потом,

example <- sqlQuery(myDB,"SELECT * FROM dbo.my_table_fn (x)")

Or...

example2 <- sqlQuery(myDB,"SELECT * FROM dbo.some_random_table AS foo WHERE foo.ID = x")

Or...

example3 <- sqlQuery(myDB,"EXEC dbo.my_stored_proc (x)")

Очевидно, что ничего из этого не работает, но я думаю, что есть что-то, что обеспечивает такую ​​функциональность.


person Ray    schedule 01.12.2010    source источник


Ответы (4)


Создайте строку, которую вы собираетесь передать. Итак, вместо

example <- sqlQuery(myDB,"SELECT * FROM dbo.my_table_fn (x)")

do

example <- sqlQuery(myDB, paste("SELECT * FROM dbo.my_table_fn (", 
                                x, ")", sep=""))

который заполнит значение x.

person Dirk Eddelbuettel    schedule 01.12.2010
comment
Имейте в виду, однако, ужасные последствия, если ваше значение x похоже на col); DELETE * FROM my_table_fn; SELECT * FROM my_table_fn (col. Вот почему гораздо лучше использовать заполнители, чем paste(). Некоторые драйверы поддерживают заполнители, некоторые нет. - person Ken Williams; 03.01.2011
comment
расширяя (возможно, улучшая) ответ @Dirk, вы можете использовать sprintf() для создания своей строки, мне кажется, что ее намного легче читать, чем paste(), например example <- sqlQuery(myDB, sprintf("SELECT * FROM dbo.my_table_fn (%s)", x)). Для замен с одной переменной разница между sprintf() и paste() не имеет большого значения, но для замен с несколькими переменными она становится более важной, например. sqlQuery(myDB, sprintf("SELECT * FROM orders WHERE order_date >= '%s' AND order_date < '%s' AND customer_id = %s", start.date, end.date, customer.id)) - person mac; 06.07.2012

Если вы используете sprintf, вы можете очень легко построить строку запроса, используя подстановку переменных. Для дополнительной простоты использования, если вы предварительно проанализируете эту строку запроса (я использую stringr), вы можете записать ее в несколько строк в своем коде.

e.g.

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)

Боковое примечание и шляпный наконечник к другому парню R

Недавно я обнаружил, что хочу сделать подстановку переменных еще проще, используя что-то вроде функции Python string.format(), которая позволяет повторно использовать и изменять порядок переменных в строке.

e.g.

$: w = "He{0}{0}{1} W{1}r{0}d".format("l","o")
$: print(w)
"Hello World"

Однако похоже, что эта функция не существует в R, поэтому я спросил в Твиттере, и очень полезный парень @kevin_ushey ответил собственной пользовательской функцией для использования в R. Проверьте!

person jonsedar    schedule 28.03.2013

С большим количеством переменных сделайте следующее:

  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)
person RIOT    schedule 08.02.2016

попробуй с этим

x <- 1
example2 <- fn$sqlQuery(myDB,"SELECT * FROM dbo.some_random_table AS foo WHERE foo.ID = '$x'")
person patricio    schedule 23.12.2010
comment
Я подозреваю, что он использует gsubfn. - person r2evans; 27.07.2016