在将字符串设置为我在SSMS中预先编写的SQL语句时,我似乎不断遇到问题。
我有两个问题,它们都是相关的。首先,与简单查询相比,我似乎只在处理稍微复杂的查询(多个连接、where条件、相关子查询和case语句)时才会遇到问题。有没有什么好的资源可以让我在将SSMS中的查询写到VBA时读到语法“规则”?
其次,下面是我在AdventureWorks示例数据库中编写的查询示例,它给出了这个问题标题中列出的错误。我的T-SQL语句是:
sSQL = "SELECT ba.BusinessEntityID,ba.AddressID
,(CASE WHEN ba.BusinessEntityID > 5
THEN
(SELECT pp.FirstName FROM [Person].[Person] pp
WHERE pp.BusinessEntityID = ba.BusinessEntityID)
Else 'AA' END) AS 'TEST'
FROM Person.BusinessEntityAddress ba
INNER JOIN person.AddressType at ON at.AddressTypeID = ba.AddressTypeID
WHERE ba.BusinessEntityID < 11;"错误出现在"Set rs = db.OpenRecordset(sSQL,dbOpenDynaset,dbSeeChanges)“行,该行为:
“运行时错误3075查询表达式中出现语法错误(缺少运算符) '(CASE WHEN ba.BusinessEntityID >5 THEN (SELECT pp.FirstName FROM Person.Person pp WHERE pp.BusinessEntityID = ba.BusinessEntityID) Else 'AA‘END) AS 'TEST'”
发布于 2015-11-17 14:14:13
尝尝这个
sSQL = "SELECT ba.BusinessEntityID,ba.AddressID
,(CASE WHEN ba.BusinessEntityID > 5
THEN
(SELECT pp.FirstName FROM [Person].[Person] pp
WHERE pp.BusinessEntityID = ba.BusinessEntityID)
Else 'AA' END) AS TEST
FROM Person.BusinessEntityAddress ba
INNER JOIN person.AddressType at ON at.AddressTypeID = ba.AddressTypeID
WHERE ba.BusinessEntityID < 11;"不需要在别名中使用引号。如果您必须这样做,那么还有其他方法(如删除AS或使用双引号),但不建议这样做。
发布于 2018-09-13 08:09:53
这里的问题是,您试图在需要Access SQL语句的地方使用TSQL语句。Access SQL不支持CASE WHEN,也不支持许多TSQL支持的结构。
OpenRecordset方法需要表名、保存的查询名或Access SQL语句。
您可以通过在Microsoft Access中创建并保存传递查询来解决此问题。创建传递查询时,可以使用TSQL语句,并在传递查询的属性中设置到SQL数据库的连接字符串。
顾名思义,Access将传递查询的分析和执行传递给SQL Server。
保存传递查询并对其进行测试后,可以按原样使用OpenRecordset命令,只需将第一个参数替换为传递查询的名称即可。
https://stackoverflow.com/questions/33750078
复制相似问题