使用 R 中定义的变量从 R 运行 SQL 脚本
Posted
技术标签:
【中文标题】使用 R 中定义的变量从 R 运行 SQL 脚本【英文标题】:Run SQL script from R with variables defined in R 【发布时间】:2021-12-14 23:24:26 【问题描述】:我有一个需要使用 R Studio 运行的 SQL 脚本。但是,我的 SQL 脚本有一个在我的 R 环境中定义的变量。我正在使用dbGetQuery
;但是,我不知道(也没有找到解决方案)如何传递这些变量。
library(readr)
library(DBI)
library(odbc)
library(RODBC)
#create conection (fake one here)
con <- odbcConnect(...)
dt = Sys.Date()
df = dbGetQuery(.con, statement = read_file('Query.sql'))
“Query.sql”文件引用了dt
。如何让文件识别我的变量dt
?
【问题讨论】:
看看glue_sql
:glue.tidyverse.org/reference/glue_sql.html。
仅供参考,有几件事:(1)您定义 con
并使用 .con
(点),可能是一个错字。 (2) 您似乎正在使用从RODBC
创建的con
,但试图在DBI
函数中使用它。我没有用过RODBC
,但你确定它合适且实用吗? (3) 实际上,你需要RODBC
(有odbcConnect
和sqlQuery
但没有绑定参数支持),或者你需要DBI
和odbc
(有dbConnect
和dbGetQuery
,支持绑定参数)。你不需要两个都需要。
【参考方案1】:
有多种选择,但我更喜欢"bound parameters"。
例如,如果您的 'Query.sql'
看起来像
select ...
from MyTable
where CreatedDateTime > ?
?
是绑定的占位符。
那你就可以了
con <- dbConnect(...) # from DBI
df = dbGetQuery(con, statement = read_file('Query.sql'), params = list(dt))
更多参数,在list
中添加更多?
s和更多对象,如
qry <- "select ... where a > ? and b < ?"
newdat <- dbGetQuery(con, qry, params = list(var1, var2))
如果您需要一个 SQL IN
子句,它会有点冒险,因为它不会像我们想要的那样精确地绑定东西。
candidate_values <- c(2020, 1997, 1996, 1901)
qry <- paste("select ... where a > ? and b in (", paste(rep("?", length(candidate_values)), collapse=","), ")")
qry
# [1] "select ... where a > ? and b in ( ?,?,?,? )"
df <- dbGetQuery(con, qry, params = c(list(avar), as.list(candidate_values)))
【讨论】:
如果我有两个变量,有没有办法调整这个解决方案? 是的,阅读文档。长话短说:qry <- "select ... where a > ? and b < ?"
,然后是dbGetQuery(con, qry, params = list(var1, var2))
。以上是关于使用 R 中定义的变量从 R 运行 SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章
使用 ggplot2 对象和自定义字体从终端运行 R 脚本(字体类型无效)