NGa*_*ney 7 sql sql-server r knitr r-markdown
我正在尝试使用RStudio 1.0预览版中提供的SQL块功能连接到SQL Server(使用RSQL的RSQLServer后端),并且我在传递变量时遇到一些困难.
如果我连接到服务器,然后将查询放入块中,它按预期工作
```{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
```
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将查询作为变量传递,则会抛出错误
```{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
Run Code Online (Sandbox Code Playgroud)
我认为这与R在引号中包含字符向量的方式有关,因为如果运行以下代码,我会得到相同的错误.
```{sql, connection = svr, eval = F}
'SELECT TOP 10 * FROM Database_name.dbo.table_name'
```
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个错误?
目前我可以通过使用内联表达式打印查询来实现我想要的,使用pygments突出显示并在带有DBI命令的R块中运行查询,因此使用代码块会更好一些.
看起来在查询中使用 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}
```
Run Code Online (Sandbox Code Playgroud)