R如何像SAS一样写宏

C_M*_*_Mu 2 macros r rodbc

我有一个非常长的sqlquery这样的,只需更改日期就需要运行几次.我擅长SAS但对R来说很陌生,所以我很难写出与SAS类似的东西.

df <- sqlQuery(datamart, paste0("Select xxxxxxxxxxxxxxxxxx from xxxxx
where date = '28Feb2018'"), as.is=TRUE, stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

你能分享一些经验吗?

谢谢!


于2014年6月5日编辑:

我根据下面的答案编辑了代码,我仍然在正确运行代码时遇到一些麻烦.目前我的代码变成:

safeqry <- function(date_string)
{require(RODBCext)
qry_string <- paste0("DELETE FROM [T_SPP] WHERE [BkDt]<=#?","#")
  parms <- data.frame(date_string, stringsAsFactors=FALSE)
  sqlExecute(access, qry_string, parms, fetch=TRUE)}
safeqry('2016-04-30')
Run Code Online (Sandbox Code Playgroud)

错误是:

42000 -3100 [Microsoft] [ODBC Microsoft Access驱动程序]查询表达式'[BkDt] <=#Pa_RaM000'中的日期语法错误.[RODBCext]错误:SQLExecute失败另外:警告消息:在sqlExecute(access,qry_string,parms,fetch = TRUE)中:

其他代码是

query_delete = function (table, date_col, date) {
paste0('DELETE FROM [',table,'] WHERE [',date_col,']<=#',date, '#')}
sqlQuery(access, query_delete("T_SPP", "BkDt", "2018-04-30"),as.is = TRUE, stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)

错误是

[1]"[RODBC]错误:无法SQLExecDirect'从[T_SPP]删除WHERE [BkDt] <=#2018-04-30#'"

Hon*_*Ooi 5

等效于SAS宏的R是一个函数.因此,您编写一个将日期作为参数的函数,然后将日期传递给查询.

最简单的方法是通过字符串操作:

qry <- function(date_string)
{
    qry_string <- paste0("select xxxxx from yyy where date = '", date_string, "'")
    sqlQuery(datamart, qry_string, as.is=TRUE, stringsAsFactors=FALSE)
}
Run Code Online (Sandbox Code Playgroud)

但是,这通常是不安全的,因为人们可以将恶意字符串传递给您的函数,导致它做坏事.相反,请考虑使用RODBCext包来运行参数化查询,而不是弄乱字符串:

safeqry <- function(date_string)
{
    require(RODBCext)
    qry_string <- paste0("select xxxxx from yyy where date = ?")
    parms <- data.frame(date_string, stringsAsFactors=FALSE)
    sqlExecute(datamart, qry_string, parms, fetch=TRUE)
}
Run Code Online (Sandbox Code Playgroud)