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

VBA/ACE OLEDB/SQL运行时错误-条件表达式中的2147217913数据类型不匹配,sql,vba,oledb,Sql,Vba,Oledb,我正在使用ACE OLEDB从VBA运行SQL查询,而没有连接到Access。我这样做是为了能够快速拼凑一些Excel表格。我不希望将此转换到另一个平台,因此希望解决当前问题 VBA代码在许多查询中都可以正常工作,但在以下查询中我遇到了上述错误: SELECT bcr.DialCode, bcr.Destination, ( SELECT TOP 1 cc.CountryCode FROM t

我正在使用ACE OLEDB从VBA运行SQL查询,而没有连接到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
代码改编自:

这样做的目的是通过找到最包容的匹配项,将拨打的电话号码与目的地国家/地区进行匹配。重复使用引用的输入文本样本和与本练习相适应的预期结果:

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是否存在差异?非常感谢您的指导。

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

其次,请阅读以下文章:

最后,如果您想将一个数据与另一个以某个字符串开头的数据进行比较,可以使用以下方法:

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数据库喜欢它

子查询bcr.DialCode像cc.CountryCode+“%”我想它们应该是另一种方式?并尝试使用*作为通配符。ACE/OleDb数据库引擎不知道[%]。您必须将其替换为[*]。感谢您的指示。根据上面提供的第三个查询,该查询确实可以使用cc.CountryCode,如“1”+“%”。它输出所有以1开头且最大长度为4的国家/地区代码。我尝试更改*的%s和[*]时出现了相同的错误。尝试使用[*]重新对“%”进行绘图,但未获得一个或多个必需参数的给定值。还有其他想法吗?请检查我的答案。谢谢你的进一步回复。使用您提供的代码,我得到一个最多一条记录可以由这个子查询返回。错误它应该产生与表1中的行一样多的匹配,因为所有调用都将匹配到至少一个国家/地区。这算是真正的左连接吗?我是否应该将其改为使用左连接,而不是我正在遵循的解决方案?@nbayly,检查更新的答案。这将返回CountryCode以DialCode开头的所有数据。祝你好运现在运行时没有错误,但是查询的逻辑存在一些问题,我希望您能提供帮助。它没有输出最具包容性的匹配项。例如,对于拨号代码“7708”,它与俄罗斯拨号代码“7”相匹配,而不是更具包容性的“77”哈萨克斯坦。有什么建议吗?我将您的答案标记为正确,因为它确实解决了运行时错误。@n对不起,对不起,但无法让您。。。如果CountryCode为7,则上述查询应匹配以7开头的拨号代码。因此,它应该返回{7,70,717,7771等}如果拨号代码是“7708”,它应该返回“7”俄罗斯和“77”哈萨克斯坦之间最包容的匹配国家代码,在这种情况下,将是“77”,作为拨号代码匹配的更多左位数字。我希望这能澄清你的疑问。