动态SQL未返回Access传递查询的结果

Bre*_*ent 11 sql-server ms-access

请考虑以下代码.

DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'SELECT * FROM caseinformation'
EXEC(@sql)
Run Code Online (Sandbox Code Playgroud)

当我在SSMS中运行它时,它显示的结果与我运行时的结果相同SELECT * FROM caseinformation.但是,当我将其作为Access传递查询运行时,我收到以下错误消息:

将ReturnsRecords属性设置为True的传递查询未返回任何记录.

是什么赋予了?

Nar*_*son 24

在动态传递查询的开头添加以下内容:

SET NoCount ON
Run Code Online (Sandbox Code Playgroud)

并且您将能够使用MS Access中的查询.

为什么这样做,我将不得不让其他人解释,但我知道它确实有效.

  • 这就是为什么我的做法是*总是*在批处理开始时使用`SET NOCOUNT ON`,除非有理由让它出发. (4认同)
  • 令人害怕的是NOCOUNT ON使用ODBC和ADO/DAO修复东西的频率.我的信念是调用代码认为rowcount返回的是一个结果集,但我不能说为什么我相信这一点. (3认同)
  • Access抱怨的声明实际上是您的SELECT @sql =,它看起来像一个select语句但不返回记录集.当您说SET NOCOUNT ON时,这将关闭导致Access失败查询的ReturnsRecords属性. (2认同)

小智 11

这种解释是不正确的:

Access抱怨的声明实际上是您的SELECT @sql =,它看起来像一个select语句但不返回记录集.当您说SET NOCOUNT ON时,这将关闭导致Access失败查询的ReturnsRecords属性.

......因为那不是发生的事情.

更详细的解释是SQL Server可以从查询或存储过程调用返回多个结果集.这些结果集不是所有记录集,可以是标量值和行集的混合.当Set NoCount为OFF时,SQL Server依次返回行集,然后返回BOTH到调用代码的记录数.由于VBA没有寻找标量和记录集返回值的这种复杂混合,因此会产生原始错误(因为标量值实际上是在结果集的TOP处返回的,即FIRST).

当在SQL Server上执行Set NoCount ON时,这告诉SQL Server不要将计数作为结果集的一部分返回.这导致Access/VBA/DAO能够将结果集识别为记录集(即使它实际上是一个多记录集),然后一切都按预期工作.