带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075

Posted

技术标签:

【中文标题】带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075【英文标题】:MS Access VBA Runtime error 3075 on SQL Query with subquery 【发布时间】:2015-01-20 15:20:12 【问题描述】:

我在 VBA 中遇到问题,执行 SQL 查询会生成运行时错误 3075。

在 Microsoft SQL Server Manager 中运行相同的查询,我没有遇到任何问题,并且返回了所需的结果。

我尝试使用 Debug.print 打印 sql-query(如此处建议的那样:https://***.com/a/3136299/4474367)以查看查询的外观 - 它看起来不错,并且可以完美地粘贴到 SQL Server 管理器中。

我正在做的是为某个经销商(和一些其他标准)选择总行数(调查响应),将结果除以 A2 = 5 的总行数(通过子查询选择)然后乘以 100 得到 A2 = 5 的百分比。

你们觉得哪里不对? Access 中是否有任何我可能没有考虑到的限制?错误消息中仅显示子查询。

这是我的查询(我用换行符把它剪掉了一点,以便于阅读):

SELECT DealerCode, 
    (SELECT CAST(COUNT(A2) AS FLOAT) 
    FROM dbo_Service 
    WHERE A2 = 5 
    AND MarketCode = 'CA' 
    AND DealerCode = '3140' 
    AND CompleteDate BETWEEN '2014-01-20' 
    AND '2015-01-20') / COUNT(*) * 100 AS TopBox 
FROM dbo_Service 
WHERE DealerCode = '3140' 
AND MarketCode = 'CA' 
AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20' 
GROUP BY DealerCode;

未删减版(与上面完全相同,但没有换行符):

SELECT DealerCode, (SELECT CAST(COUNT(A2) AS FLOAT) FROM dbo_Service WHERE A2 = 5 AND MarketCode = 'CA' AND DealerCode = '3140' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20') / COUNT(*) * 100 AS TopBox FROM dbo_Service WHERE DealerCode = '3140' AND MarketCode = 'CA' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20' GROUP BY DealerCode;

VBA Snippet,查询过程:

strSQL = "SELECT DealerCode, (SELECT CAST(COUNT(A2) AS FLOAT) FROM dbo_Service WHERE A2 = 5 AND MarketCode = 'CA' AND DealerCode = '3140' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20') / COUNT(*) * 100 AS TopBox FROM dbo_Service WHERE DealerCode = '3140' AND MarketCode = 'CA' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20' GROUP BY DealerCode;"
Debug.Print strSQL
Set rs = db.OpenRecordset(strSQL)
topBox = rs!topBox
db.Close

这是我收到的错误图片的链接

最好的问候和感谢阅读!

【问题讨论】:

欢迎来到 Stack Overflow。 CAST 不是 Access SQL 中支持的函数。 谢谢!这感觉就像我真的应该早点想到的东西,如果要添加一个面部表情,我现在肯定会使用它!再次感谢您的快速回复! 【参考方案1】:

这是一个 SQL Server 方言查询,而不是 MS Access。您需要在 SQL Server 上执行查询,即传递查询。有关更多信息和解决方案,请参阅 SQL Server Passthrough query stored into an Access VBA recordset。

【讨论】:

感谢您的回答!从这里测试了这两种解决方案后,我开始在 VBA 中编辑我的 SQL 查询,它就像一个魅力。不过,您提交的链接在其他方面对我有所帮助,谢谢!【参考方案2】:

因此,在按照 HansUp 的回答后,我编辑了我的 SQL 查询并将 CAST 替换为 Cdbl。

现在看起来像这样:

"SELECT DealerCode, ((SELECT CDbl(COUNT(A2)) FROM dbo_Service WHERE A2 = 5 AND MarketCode = 'CA' AND DealerCode = '3140' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20') / COUNT(*)) * 100 AS TopBox FROM dbo_Service WHERE DealerCode = '3140' AND MarketCode = 'CA' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20' GROUP BY DealerCode;"

当更改为 Cdbl 而不是 CAST 时,我还必须在 CAST 之后删除“AS FLOAT”。

简而言之,它看起来像这样:

SELECT CDbl(COUNT(A2))

而不是这个:

SELECT CAST(COUNT(A2) AS FLOAT)

快速解决问题!

感谢您的回答!

【讨论】:

以上是关于带有子查询的 SQL 查询上的 MS Access VBA 运行时错误 3075的主要内容,如果未能解决你的问题,请参考以下文章

MS-Access SELECT TOP N 子查询 SQL

MS Access/SQL 子查询的语法,包括聚合函数

返回多个字段的 MS Access 子查询

mysql vs ms-access DB上的sql查询左连接

如何在WHERE子句中使用MS Access SQL子查询来替换长OR表达式

MS Access,如何将参数传递给子查询?