我有一个相当简单的问题。
我每天使用RODBC软件包在R中执行数据分析。我使用SQL将它连接到我们的数据仓库并将其移动到R环境
dbhandle <- odbcDriverConnect('driver={SQL Server};server=SQLSERVER;database=MYDATABASE;trusted_connection=true')
degrees <- sqlQuery(dbhandle, "select Inst, ID, DegreeDate, Degree from DEGREE where FY = ('2015') group by Inst, ID, DegreeDate, Degree order by Inst, ID, DegreeDate, Degree", as.is=TRUE)
你知道如何在MS Access中弹出一个窗口,询问你有什么样的风险吗?你投入2015年,你将获得该财政年度的所有下降。
在R中有什么办法吗?我在Stack Overflow上看到的参数查询问题涉及更改SQL数据库中的数据,我对此不感兴趣。我只想设置一些非常基本的限制,以便我可以重新运行代码。
有些人可能会怀疑“为什么你不能把5改为6?”这是一个公平的观点,但我担心,对于更复杂的查询,用户可能会错过SQL查询中的一部分,将5更改为6,这会使分析变得混乱或减慢分析速度。
谢谢! 沃克
答案 0 :(得分:1)
您可以在开始时创建输入变量并将其传递给查询。 例如:
# Change your FY here
input_FY <- 2016
dbhandle <- odbcDriverConnect('driver={SQL Server};server=SQLSERVER;database=MYDATABASE;trusted_connection=true')
degrees <- sqlQuery(dbhandle, paste0("
select Inst, ID, DegreeDate, Degree
from DEGREE
where FY = ('", input_FY, "')
group by Inst, ID, DegreeDate, Degree
order by Inst, ID, DegreeDate, Degree"),
as.is=TRUE)
因此,对于任何复杂的查询,您仍然可以传递相同的input_FY
变量或您在代码开头声明的任何其他变量,以便快速/轻松地进行更新。
答案 1 :(得分:1)
Input Parameter pop-up box严格来说是MSAccess.exe GUI功能。如果通过ODBC将MS Access作为后端数据库(在MS Office软件之外)运行,则使用未知参数的查询将失败,并且在调用ODBC的脚本上引发错误。
因此,您需要使用GWidgets或Shiny之类的库在R中创建类似的GUI弹出框,然后将用户的输入值传递给查询。如果恶意用户运行SQL注入并可能擦除数据或破坏您的SQL Server数据库,请使用实际parameterization using RODBCext(RODBC的扩展名)执行此操作。
下面是一个使用GWidgets2的示例,其中包含 Fiscal Years 的组合框(下面的屏幕截图)。
<强>库强>
library(RDOBC)
library(RODBCext)
library(gWidgets2)
library(gWidgets2tcltk)
options(guiToolkit="tcltk")
GUI功能 (事先创建R和SQLServer gif图像)
mainWindow <- function(){
# TOP OF WINDOW
win <- gWidgets2::gwindow("Fiscal Year User Input", height = 200, width = 300)
tbl <- glayout(cont=win, spacing = 8, expand=TRUE)
# IMAGE
tbl[1,1] <- gimage(filename = "RSQLServerGUI.gif",
dirname = "/path/to/gif/image", container = tbl)
# LABEL
tbl[2,1] <- glabel("Fiscal Year Selection: ", container = tbl)
font(tbl[2,1]) <- list(size=12, family="Arial")
# COMBO BOX OF FISCAL YEARS
tbl[3,1, expand=TRUE] <- fiscal_year_cbo <- gcombobox(as.character(c(2012:2018)),
selected = 1, editable = TRUE,
index=TRUE, container = tbl)
font(tbl[3,1]) <- list(size=16, family="Arial")
# COMBO BOX CHANGE FUNCTION (2012 - 2018)
addHandlerChanged(fiscal_year_cbo, handler=function(...) {
fiscal_year_value <- svalue(fiscal_year_cbo) # GET USER SELECTED VALUE
gmessage(paste("You selected FY:", fiscal_year_value))
degrees <- getDegreesData(fiscal_year_value) # GET DATABASE DATA
dispose(win) # CLOSE WINDOW
})
}
查询功能 (在上面的组合框更改处理程序中调用)
getDegreesData <- function(fy_param) {
dbhandle <- odbcDriverConnect('driver={SQL Server};server=SQLSERVER;database=MYDATABASE;trusted_connection=true')
# PREPARED STATEMENT (NO CONCATENATED DATA)
strSQL <- "select Inst, ID, DegreeDate, Degree
from DEGREE
where FY = ?
group by Inst, ID, DegreeDate, Degree
order by Inst, ID, DegreeDate, Degree"
# PASS PARAMETER TO RETURN DATAFRAME
sql_df <- sqlExecute(dbhandle, strSQL, fy_param, fetch=TRUE)
odbcClose(dbHandle)
return(sql_df)
}
运行GUI
m <- mainWindow()
<强>截图强>