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中的查询.
为什么这样做,我将不得不让其他人解释,但我知道它确实有效.
小智 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能够将结果集识别为记录集(即使它实际上是一个多记录集),然后一切都按预期工作.
| 归档时间: |
|
| 查看次数: |
9820 次 |
| 最近记录: |