使用 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(有odbcConnectsqlQuery没有绑定参数支持),或者你需要DBIodbc(有dbConnectdbGetQuery,支持绑定参数)。你不需要两个都需要 【参考方案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 &lt;- "select ... where a &gt; ? and b &lt; ?",然后是dbGetQuery(con, qry, params = list(var1, var2))

以上是关于使用 R 中定义的变量从 R 运行 SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用 ggplot2 对象和自定义字体从终端运行 R 脚本(字体类型无效)

R:从文本文件运行多行 sql

是否可以从脚本中检索 Javascript 变量以在 R 中使用它

路径中的 SQLCMD 变量

R中的SQL脚本仅提供有限数量的观察

脚本从 R 运行,但不是通过命令行