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

时间:2015-11-17 05:54:50

标签: sql sql-server vba ms-access access-vba

在设置字符串和我在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;"

在“设置rs = db.OpenRecordset(sSQL,dbOpenDynaset,dbSeeChanges)”行中出现错误,其中包含:

“查询表达式中的运行时错误3075语法错误(缺少运算符)”(例如,BA.BusinessEntityID&gt; 5时的情况                     然后                     (SELECT pp.FirstName FROM [Person]。[Person] pp                     WHERE pp.BusinessEntityID = ba.BusinessEntityID)                    否则'AA'结束)作为'测试'“

2 个答案:

答案 0 :(得分:0)

试试这个

a

无需在别名中使用引号。如果必须,那么还有其他方法(例如删除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;" 或使用双引号),但不建议使用。

答案 1 :(得分:0)

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

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

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

顾名思义,Access 传递解析和执行对SQL Server的传递查询。

一旦保存了传递查询并对其进行了测试,就可以按原样使用OpenRecordset命令,只需将第一个参数替换为传递查询的名称即可。