访问VBA错误3075语法错误(缺少运算符)

问题描述 投票:0回答:2

在设置字符串和我在SSMS中预先编写的SQL语句时,我似乎不断遇到问题。

我有2个问题都是相关的。首先,在处理一些更复杂的查询(几个连接,条件,相关子查询和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语法错误(缺少运算符)”(例如,BA.BusinessEntityID> 5那么(选择pp.FirstName FROM [Person]。[Person] pp WHERE pp.BusinessEntityID = ba.BusinessEntityID)Else' AA'结束)作为'测试'“

sql sql-server vba ms-access access-vba
2个回答
0
投票

试试这个

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或使用双引号),但不建议。


0
投票

这里的问题是您正在尝试使用需要Access SQL语句的TSQL语句。 Access SQL不支持CASE WHEN或TSQL支持的许多构造。

OpenRecordset方法需要表名,保存的查询名或Access SQL语句。

您可以通过在Microsoft Access中创建和保存传递查询来解决此问题。创建Pass Through Query时,您可以使用TSQL语句,并在Pass Through Query的属性中将连接字符串设置为SQL数据库。

顾名思义,Access将解析和执行Pass Through Query传递给SQL Server。

保存Pass Through Query并对其进行测试后,您可以按原样使用OpenRecordset命令,只需将第一个参数替换为Pass Through Query的名称即可。

© www.soinside.com 2019 - 2024. All rights reserved.