动态 SQL 在 Access 直通查询中未返回结果
Posted
技术标签:
【中文标题】动态 SQL 在 Access 直通查询中未返回结果【英文标题】:Dynamic SQL not returning results in Access pass-through query 【发布时间】:2011-01-06 18:54:57 【问题描述】:考虑下面的代码。
DECLARE @sql VARCHAR(MAX)
SELECT @sql = 'SELECT * FROM caseinformation'
EXEC(@sql)
当我在 SSMS 中运行它时,它显示的结果与我运行 SELECT * FROM caseinformation
时的结果相同。但是当我将其作为 Access 传递查询运行时,我收到以下错误消息:
将 ReturnsRecords 属性设置为 True 的传递查询未返回任何记录。
什么给了?
【问题讨论】:
【参考方案1】:在动态传递查询的开头添加以下内容:
SET NoCount ON
您将能够使用 MS Access 中的查询。
为什么这有效,我得离开让其他人解释,但我知道它确实有效。
【讨论】:
谢谢,这行得通!我将推迟接受,以防万一有人能够更完整地解释为什么会这样。 Access 抱怨的语句实际上是您的 SELECT @sql = ,它看起来像一个 select 语句,但不返回记录集。当您说 SET NOCOUNT ON 时,这会关闭导致 Access 查询失败的 ReturnsRecords 属性。 NOCOUNT ON 使用 ODBC 和 ADO/DAO 修复问题的频率令人恐惧。我的信念是调用代码认为返回的行数是一个结果集,但我不能说我为什么相信。 这就是为什么我的习惯是总是在批处理开始时使用SET NOCOUNT ON
,除非有理由让它启动。
有点晚了,但是SET NOCOUNT ON的原因是这样的:【参考方案2】:
这个解释不正确:
Access 抱怨的声明实际上是您的 SELECT @sql = ,它看起来像一个 select 语句,但不是 返回一个记录集。当您说 SET NOCOUNT ON 时,这会关闭 导致 Access 查询失败的 ReturnsRecords 属性。
...因为事实并非如此。
更详细的解释是 SQL Server 可以从查询或存储过程调用返回多个结果集。这些结果集并不都是记录集,可以是标量值和行集的混合。 当 Set NoCount 为 OFF 时,SQL Server 依次将行集和记录计数返回给调用代码。由于 VBA 不是在寻找这种标量和记录集返回值的复杂组合,因此会导致原始错误结果(因为标量值实际上是在结果集的顶部返回,即 FIRST)。
当在 SQL Server 上执行 Set NoCount ON 时,这告诉 SQL Server 不要将计数作为结果集的一部分返回。这导致 Access/VBA/DAO 能够将结果集识别为记录集(即使它实际上是多个记录集),然后一切都按预期工作。
【讨论】:
实际上我什至得到了这个“SET @”而不是 SELECT @以上是关于动态 SQL 在 Access 直通查询中未返回结果的主要内容,如果未能解决你的问题,请参考以下文章
MS Access 直通选择查询导致 SQL Server 中的页面锁定
Access 中的 T-SQL 直通查询是不是可以包含本地 Access 表?
如何使 MS Access 直通查询在 SQL Server 中正确运行