将R变量传递给RODBC的sqlQuery函数?

23

有没有办法将在R中定义的变量传递给RODBC包中的sqlQuery函数?

具体来说,我需要将这样的变量传递给标量/表值函数、存储过程和/或SELECT语句的WHERE子句。

例如,让:

x <- 1 ## user-defined

那么,

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

或者...

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

或者...

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

显然,这些都行不通,但我认为有一种方法可以实现这种功能。


4个回答

21

构建你打算传递的字符串。因此,不是

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

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

这将填充x的值。


4
请注意,如果您的 x 值类似于 col); DELETE * FROM my_table_fn; SELECT * FROM my_table_fn (col,那么会带来严重的后果。这就是为什么使用占位符比使用 paste() 更好的原因。某些驱动程序支持占位符,而其他一些则不支持。 - Ken Williams
6
可以在@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)) - mac

3
如果您使用sprintf,可以通过变量替换非常容易地构建查询字符串。为了便于使用,如果您预解析该查询字符串(我使用的是stringr),则可以在代码的多行中编写它。
例如:
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()函数来使变量替换更加简单,这个函数允许你在字符串中重复使用和重新排序变量。

例如:

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

然而,在R语言中似乎不存在这个功能,所以我在Twitter上询问了一下,并且非常友好的小伙子@kevin_ushey回复说他有自己的自定义函数可以在R中使用。请查看它!


-2

有更多的变量,就这样做:

  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)

-2

试试这个

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

3
错误:找不到对象'fn'。 - Marek
1
我怀疑它正在使用gsubfn - r2evans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接