Sql server 带子查询的SQL查询出现MS Access VBA运行时错误3075
我在VBA中遇到了一个问题,SQL查询的执行会生成运行时错误3075 在Microsoft SQL Server Manager中运行相同的查询时,我没有遇到任何问题,并且返回了所需的结果 我尝试使用Debug.print打印sql查询(如这里所建议的那样:),以查看查询的外观-它看起来正常,并且粘贴到sql Server Manager中工作得非常好 我所做的是为某个经销商(以及其他一些标准)选择行总数(调查响应),将结果除以A2=5(通过子查询选择)的行总数,然后乘以100得到A2=5的百分比 你们觉得怎么了?是否存在我可能没有考虑的访问限制?错误消息中仅显示子查询 以下是我的问题(我用换行符将其切碎,以便阅读): 未切割版本(与上面完全相同,但没有换行符): VBA代码段,查询过程:Sql server 带子查询的SQL查询出现MS Access VBA运行时错误3075,sql-server,ms-access,vba,ms-access-2010,Sql Server,Ms Access,Vba,Ms Access 2010,我在VBA中遇到了一个问题,SQL查询的执行会生成运行时错误3075 在Microsoft SQL Server Manager中运行相同的查询时,我没有遇到任何问题,并且返回了所需的结果 我尝试使用Debug.print打印sql查询(如这里所建议的那样:),以查看查询的外观-它看起来正常,并且粘贴到sql Server Manager中工作得非常好 我所做的是为某个经销商(以及其他一些标准)选择行总数(调查响应),将结果除以A2=5(通过子查询选择)的行总数,然后乘以100得到A2=5的百分
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
这是我收到的错误图像的链接
最好的问候和感谢阅读 这是SQL Server方言查询,不是MS Access。您需要在SQL Server上执行查询,这是一个传递查询。有关更多信息和解决方案,请参阅。这是SQL Server方言查询,而不是MS Access。您需要在SQL Server上执行查询,这是一个传递查询。有关更多信息和解决方案,请参阅。因此,在遵循HansUp的回答后,我编辑了我的SQL查询,并用Cdbl替换了CAST 现在看起来是这样的:
"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;"
SELECT CDbl(COUNT(A2))
当转换为Cdbl而不是CAST时,我还必须在转换后删除“AS FLOAT”
简而言之,它看起来是这样的:
"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;"
SELECT CDbl(COUNT(A2))
与此相反:
SELECT CAST(COUNT(A2) AS FLOAT)
一个快速解决办法,做的工作
谢谢你的回答 所以,在遵循HansUp的回答之后,我编辑了我的SQL查询,并用Cdbl替换了CAST 现在看起来是这样的:
"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;"
SELECT CDbl(COUNT(A2))
当转换为Cdbl而不是CAST时,我还必须在转换后删除“AS FLOAT”
简而言之,它看起来是这样的:
"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;"
SELECT CDbl(COUNT(A2))
与此相反:
SELECT CAST(COUNT(A2) AS FLOAT)
一个快速解决办法,做的工作
谢谢你的回答 欢迎来到堆栈溢出<代码>强制转换在Access SQL中不受支持。谢谢!这感觉就像我真的应该早就想到的东西,如果有一个facepalm笑脸可以添加,我现在肯定会使用它!再次感谢您的快速回复!欢迎来到堆栈溢出<代码>强制转换在Access SQL中不受支持。谢谢!这感觉就像我真的应该早就想到的东西,如果有一个facepalm笑脸可以添加,我现在肯定会使用它!再次感谢您的快速回复!谢谢你的回答!在使用这两种解决方案进行测试之后,我开始在VBA中编辑SQL查询,它的工作非常出色。你提交的链接在其他方面帮助了我,谢谢!谢谢你的回答!在使用这两种解决方案进行测试之后,我开始在VBA中编辑SQL查询,它的工作非常出色。你提交的链接在其他方面帮助了我,谢谢!