将查询作为变量传递给Rmarkdown sql chunk

时间:2016-09-22 04:27:53

标签: sql sql-server r knitr r-markdown

我尝试使用SQL chunk function中提供的preview version of RStudio 1.0连接到SQL Server(使用RSQL的DBQL后端),并且我在传递变量方面遇到了一些困难

如果我连接到服务器,然后将查询放入块中,则按预期工作

```{r, eval = F}
svr <- dbConnect(RSQLServer::SQLServer(), "Server_name", database = 'Database_name')
query <- 'SELECT TOP 10 * FROM Database_name.dbo.table_name'
```
```{sql, connection = svr, eval = F}
SELECT TOP 10 * FROM Database_name.dbo.table_name
```

但是如果我尝试将查询作为变量传递,则会抛出错误

```{sql, connection = svr, eval = F}
?query
```

Error: Unable to retrieve JDBC result set for 'SELECT TOP 10 * FROM Database_name.dbo.table_name': Incorrect syntax near 'SELECT TOP 10 * FROM Database_name.dbo.table_name'.
Failed to execute SQL chunk

我认为这与R在引号中包含字符向量的方式有关,因为如果运行以下代码,我会得到相同的错误。

```{sql, connection = svr, eval = F}
'SELECT TOP 10 * FROM Database_name.dbo.table_name'
```

有没有办法解决这个错误?

目前,我可以通过using inline expressions to print the queryusing the pygments for highlighting实现我想要的功能,并使用DBI命令在R块中运行查询,因此使用代码块会更好一些。

2 个答案:

答案 0 :(得分:4)

看起来Using R variables in queries会应用某种转义,因此只能用于文档(SELECT * FROM trials WHERE subjects >= ?subjects)中的示例,但不能动态设置整个查询。

相反,code chunk option可用于实现所需的行为:

该示例使用SQLite sample database中的sqlitetutorial.net。在运行代码之前将其解压缩到您的工作目录。

```{r}
library(DBI)
db <- dbConnect(RSQLite::SQLite(), dbname = "chinook.db")
query <- "SELECT * FROM tracks"
```


```{sql, connection=db, code = query}
```

答案 1 :(得分:1)

我还没有能够确定在同一块中打印和执行的方法,但是通过一些额外的代码行可以实现我想要的输出。

打印由CL.'s answer解决,然后我可以使用EXEC来运行代码。

```{sql, code = query}
```

```{sql, connection = svr}
EXEC (?query)
```