将R变量传递给RODBC的sqlQuery?

Ray*_*Ray 19 sql r rodbc

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

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

例如,让:

x <- 1 ## user-defined
Run Code Online (Sandbox Code Playgroud)

然后,

example <- sqlQuery(myDB,"SELECT * FROM dbo.my_table_fn (x)")
Run Code Online (Sandbox Code Playgroud)

要么...

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

要么...

example3 <- sqlQuery(myDB,"EXEC dbo.my_stored_proc (x)")
Run Code Online (Sandbox Code Playgroud)

显然,这些都不起作用,但我认为有一些能够实现这种功能的东西.

Dir*_*tel 18

构建您打算传递的字符串.而不是

example <- sqlQuery(myDB,"SELECT * FROM dbo.my_table_fn (x)")
Run Code Online (Sandbox Code Playgroud)

example <- sqlQuery(myDB, paste("SELECT * FROM dbo.my_table_fn (", 
                                x, ")", sep=""))
Run Code Online (Sandbox Code Playgroud)

这将填补价值x.

  • 在@Dirk的答案上扩展(可能正在改进),你可以使用`sprintf()`来构建你的字符串,我发现它比`paste()`更容易阅读,例如`example < - sqlQuery(myDB,sprintf(" SELECT*FROM dbo.my_table_fn(%s)",x))`.对于单变量替换,`sprintf()`和`paste()`之间的区别并不大,但对于多变量替换,它变得更加重要,例如`sqlQuery(myDB,sprintf("SELECT*FROM)订单WHERE order_date> ='%s'AND order_date <'%s'AND customer_id =%s",start.date,end.date,customer.id))` (5认同)
  • 但请记住,如果你的`x`值类似于'col',那将是可怕的后果; DELETE*FROM my_table_fn; SELECT*FROM my_table_fn(col`.这就是为什么使用占位符比使用`paste()`更好.有些驱动程序支持占位符,有些则不支持. (4认同)