以编程方式构建 SQL 查询 R/Shiny/RODBC
Programmatically building SQL Query R/Shiny/RODBC
我正在 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
Server]Incorrect syntax near '‘'. [RODBC] ERROR: Could not
SQLExecDirect 'Select [sensor_name], [temperature] from
[dbo].[temperature_sensor] where network_id = '24162' and date >
‘18-09-2017’ and date < ‘22-09-2017’'
我需要在 "select ...., I tried to explicitly add """ 或 dQuote("") 中使用 " 来关闭字符串以连接 " 但我仍然遇到错误。
非常感谢任何建议?
我建议使用 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 注入。
我正在 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 Server]Incorrect syntax near '‘'. [RODBC] ERROR: Could not SQLExecDirect 'Select [sensor_name], [temperature] from [dbo].[temperature_sensor] where network_id = '24162' and date > ‘18-09-2017’ and date < ‘22-09-2017’'
我需要在 "select ...., I tried to explicitly add """ 或 dQuote("") 中使用 " 来关闭字符串以连接 " 但我仍然遇到错误。
非常感谢任何建议?
我建议使用 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 注入。