答案 0 :(得分:24)
在动态传递查询的开头添加以下内容:
SET NoCount ON
您将能够使用MS Access中的查询。
为什么这样做,我将不得不让其他人解释,但我知道它确实有效。
答案 1 :(得分:11)
这种解释不正确:
Access抱怨的声明实际上是你的 SELECT @sql =,看起来像是一个select语句但却没有 返回记录集。当你说SET NOCOUNT ON时,这会关闭 返回导致Access失败查询的记录属性。
......因为那不是发生的事情。
更详细的解释是SQL Server可以从查询或存储过程调用返回多个结果集。这些结果集不是所有记录集,可以是标量值和行集的混合。 当Set NoCount为OFF时,SQL Server依次返回行集,然后返回BOTH到调用代码的记录数。由于VBA没有寻找标量和记录集返回值的这种复杂混合,因此会产生原始错误(因为标量值实际上是在结果集的TOP处返回的,即FIRST)。
当在SQL Server上执行Set NoCount ON时,这告诉SQL Server不要将计数作为结果集的一部分返回。这导致Access / VBA / DAO能够将结果集识别为记录集(即使它实际上是一个多记录集),然后一切都按预期工作。