将查询作为变量传递到Rmarkdown sql块

11

我正在尝试使用RStudio 1.0预览版本中提供的SQL chunk function连接到一个SQL Server(使用DBI的RSQLServer后端),但我在传递变量时遇到一些困难。

如果我连接到服务器,然后将查询放在chunk中,它会按预期工作

```{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'
```

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

目前,我可以通过使用内联表达式打印查询结果使用pygments进行高亮显示并在R代码块中运行带有DBI命令的查询来实现我的目标,因此使用代码块会更好一些。

2个回答

5
看起来在查询中使用R变量会进行某种转义,因此只能像文档中的示例(SELECT * FROM trials WHERE subjects >= ?subjects)那样使用,但不能动态设置整个查询。
相反,可以使用code代码块选项来实现所需的行为: 本示例使用sqlitetutorial.net提供的SQLite样例数据库。在运行代码之前,请将其解压到您的工作目录中。
```{r}
library(DBI)
db <- dbConnect(RSQLite::SQLite(), dbname = "chinook.db")
query <- "SELECT * FROM tracks"
```


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

这将以比我在问题中描述的更方便的方式打印带有高亮突出显示的输出。不过看起来它没有被运行。 - NGaffney

1
我无法确定如何在同一个代码块中打印和执行,但是通过添加几行额外的代码,可以实现我想要的输出。
打印问题已经被CL的回答解决,然后我可以使用EXEC来运行代码。
```{sql, code = query}
```

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接