在设置字符串和我在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'结束)作为'测试'“
答案 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
命令,只需将第一个参数替换为传递查询的名称即可。