VBA/ACE OLEDB/SQL 运行-时间错误-2147217913 标准表达式中的数据类型不匹配

VBA/ACE OLEDB/SQL Run-Time error -2147217913 Data type mismatch in criteria expression

我是 运行 来自 VBA 的 SQL 查询,使用 ACE OLEDB,但未连接到 Access。我这样做是为了快速拼凑一些 Excel 表格。我不打算将其转换到另一个平台,因此更愿意解决当前问题。

VBA 代码可以毫无问题地处理大量查询,但我 运行 遇到了以下查询提到的错误:

SELECT
    bcr.DialCode,
    bcr.Destination,
    (
        SELECT
            TOP 1 cc.CountryCode
        FROM
            table2 AS cc
        WHERE
            bcr.DialCode LIKE cc.CountryCode+'%'
        ORDER BY LEN(cc.CountryCode) DESC
    ) AS CountryCodes
FROM
    table1 AS bcr

代码改编自:Longest prefix match in SQL Server 2000

目的是通过找到最具包容性的匹配项来将拨打的电话号码与目的地国家/地区相匹配。重复使用输入和预期结果的引用文本样本(根据本练习改编):

bcr.DialCode = '0841234567'

cc.CountryCode = {'084',
                 '0841',
                 '08412'}

Expected output = {'0841234567','Destination 1','08412'}

从网上搜索看来,我可能在查询中使用了保留字。但是我已经分别测试了查询的不同部分并且没有得到任何错误。例如:

SELECT
    bcr.DialCode,
    bcr.Destination
FROM
    table1 AS bcr

按预期工作。另外:

SELECT
    TOP 1 cc.CountryCode
FROM
    table2 AS cc
WHERE
    cc.CountryCode LIKE '1'+'%'
ORDER BY LEN(cc.CountryCode) DESC

没有错误并输出了预期的结果。

用于将查询传递给 ADO 连接的变量变暗为字符串,但我已尝试设置为 Variant,没有任何变化。

在通过 ACE 执行 SQL 时,"Longest prefix match" 查询是否不起作用?任何指导将不胜感激。

首先,请阅读我对问题的评论。

其次,请阅读这些文章:

I get a message about data type mismatch

MS Access 2003: LIKE condition (using wildcards)

最后,如果您想将一个数据与另一个 StartsWith("SomeString") 进行比较,您可以使用类似这样的方法:

SELECT
    bcr.DialCode,
    bcr.Destination,
    cc.CountryCode
FROM table1 AS bcr 
    INNER JOIN table2 AS cc 
    ON cc.CountryCode = LEFT(bcr.DialCode, LEN(cc.CountryCode))
ORDER BY LEN(cc.CountryCode) DESC;

详情请见:MS Access: Left Function

注意:不要忘记在查询结束时使用 [;]。 MS Access 数据库喜欢它 ;)