如何从dplyr::tbl获取详细的数据库错误消息?

如何从dplyr::tbl获取详细的数据库错误消息?,r,dplyr,dbplyr,R,Dplyr,Dbplyr,我用R来绘制我从数据库中提取的一些数据,具体来说: dplyr::tbl(serverfault, dbplyr::sql(" select year(p.CreationDate) year, avg(p.AnswerCount*1.0) answers_per_question, sum(iif(ClosedDate is null, 0.0, 100.0))/count(*) close_rate from Posts p wh

我用R来绘制我从数据库中提取的一些数据,具体来说:

dplyr::tbl(serverfault, 
           dbplyr::sql("
select year(p.CreationDate) year,
       avg(p.AnswerCount*1.0) answers_per_question,
       sum(iif(ClosedDate is null, 0.0, 100.0))/count(*) close_rate
from Posts p
where PostTypeId = 1
group by year(p.CreationDate)
order by year(p.CreationDate)
"))
查询失败,但我在R控制台中遇到此错误:

Error: <SQL> 'SELECT *
FROM (
select year(p.CreationDate) year,
       avg(p.AnswerCount*1.0) answers_per_question,
       sum(iif(ClosedDate is null, 0.0, 100.0))/count(*) close_rate
from Posts p
where PostTypeId = 1
group by year(p.CreationDate)
order by year(p.CreationDate)
) "zzz11"
WHERE (0 = 1)'
  nanodbc/nanodbc.cpp:1587: 42000: [FreeTDS][SQL Server]Statement(s) could not be prepared. 
我估计无法准备发言。这意味着SQL Server出于某种原因不喜欢该查询。不幸的是,它没有给出任何错误的提示。根据错误消息,在对查询进行了一段时间的修改后,我注意到它被包装在一个子选择中。复制并执行由链中的一个库构造的完整查询时,SQL Server向我提供了以下信息更丰富的错误消息:

ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML


现在解决方案显而易见:删除或注释掉ORDERBY子句。但是R控制台中的详细错误消息在哪里?如果有关系的话,我用的是Rstudio。如果我能在我正在处理的代码旁边得到完整的异常,它将帮助我更快地修复bug。需要明确的是,我经常从dplyr::tbl中得到一些神秘的错误,通常用于修复这些错误。

如果使用DBI::dbGetQuery进行查询会怎么样?这比dbplyr::sql有什么改进吗?因为您确实看到的错误消息是由nanodbc直接抛出的,我想知道dbplyr对此能做多少。我的直觉是,这不是一个容易通过在R级别的调整来修复的东西。如果是我,我会直接向专家吉姆·海斯特提交github问题。你能澄清一下你是如何获得详细错误消息的吗?@Jim:我将错误消息中的完整查询复制到了一个。哦,我不知道SEDE在错误消息中使用了什么驱动程序/连接堆栈,但是R中的错误来自freeTDS驱动程序,并且是odbc R包拥有的唯一信息。除了使用不同的驱动程序外,没有其他方法可以使此错误更具信息性,可以尝试Microsoft或RStudio professional驱动程序吗?