以编程方式构建 SQL 查询 R/Shiny/RODBC

Posted

技术标签:

【中文标题】以编程方式构建 SQL 查询 R/Shiny/RODBC【英文标题】:Programmatically building SQL Query R/Shiny/RODBC 【发布时间】:2017-09-22 16:32:58 【问题描述】:

我正在使用 R/Shiny 中的 inputDateRange() 构建 SQL 查询语句。我的问题是处理各种字符串以将日期包含在 SQL 的 WHERE 条件中:

这是我的代码:

t.query <- paste0("Select [sensor_name], [temperature] from [dbo].
[temperature_sensor] where network_id = '24162' and date > "
, sQuote(format(input$my.dateRange[1], format="%d-%m-%Y"))  
, " and date < "
, sQuote(format(input$my.dateRange[2], format="%d-%m-%Y"))
)

现在语句以单引号结束,我收到以下错误:

42000 102 [Microsoft][ODBC Driver 13 for SQL Server][SQL 服务器]'''附近的语法不正确。 [RODBC] 错误:不能 SQLExecDirect '选择 [sensor_name], [temperature] from [dbo].[temperature_sensor] 其中 network_id = '24162' 和日期 > '18-09-2017' 和日期

我需要用 " 关闭字符串,因为我在 "select .... 中启动它,我尝试显式添加 """ 或 dQuote("") 来连接 ",但我仍然遇到错误。

任何建议都非常感谢?

【问题讨论】:

【参考方案1】:

我建议使用RODBCext,它允许您将查询参数化为

library(RODBCext)
channel <- odbcConnect(...) # make your connection object here
Data <- 
  sqlExecute(channel = channel,
             query = "Select [sensor_name], [temperature] 
                      from [dbo].[temperature_sensor] 
                      where network_id = ? and date between ? and ?",
             data = list('24162',
                         format(input$my.dateRange[1], 
                                format = "%Y-%m-%d"),
                         format(input$my.dateRange[2],
                                format = "%Y-%m-%d")),
             fetch = TRUE,
             stringsAsFactors = FALSE)

这种方法有很多优点,包括消除匹配引号的麻烦(由于下一个原因,您不应该这样做),并保护您的数据免受 SQL 注入。

【讨论】:

以上是关于以编程方式构建 SQL 查询 R/Shiny/RODBC的主要内容,如果未能解决你的问题,请参考以下文章

如何避免从 C# 构建的 Sql Server 2005 参数化查询变慢

如何以编程方式将 HQL 转换为 SQL 查询(不记录)

以编程方式生成 MDX 行计数查询的最简单方法?

如何(以编程方式)知道何时在 PostgreSQL/Amazon Redshift 上完成查询?

如何以编程方式将搜索查询注入 Select2 v4?

如何以编程方式检查(解析)SQL 语句的有效性?