带有子查询的 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
mysql vs ms-access DB上的sql查询左连接