【问题标题】:VBA/ACE OLEDB/SQL Run-Time error -2147217913 Data type mismatch in criteria expressionVBA/ACE OLEDB/SQL 运行时错误 -2147217913 条件表达式中的数据类型不匹配
【发布时间】:2017-06-01 04:03:01
【问题描述】:

我正在使用 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

代码改编自: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 是否可能存在差异,“最长前缀匹配”查询不起作用?任何指导将不胜感激。

【问题讨论】:

  • 子查询bcr.DialCode LIKE cc.CountryCode+'%' 我认为他们需要反过来吗?并尝试使用 * 作为通配符。
  • ACE/OleDb 数据库引擎不知道 [%]。你必须用 [*] 替换它。
  • 感谢您的指示。该查询确实可以使用cc.CountryCode LIKE '1'+'%' 如上所述(提供第三个查询)。它输出所有以1 开头并且最大LEN 为4 的国家/地区代码。我尝试将% 更改为*[*],但出现相同的错误。尝试用 [*] 替换 '%' 并得到“没有为一个或多个必需参数提供值”。还有其他想法吗?
  • 请检查我的答案。

标签: sql vba oledb


【解决方案1】:

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

其次,请阅读这些文章:

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

【讨论】:

  • 感谢您的进一步回复。使用您提供的代码,我得到“此子查询最多可以返回一条记录”。错误。它应该产生与 Table1 中的行一样多的匹配项,因为所有调用都将与至少 1 个国家/地区匹配。这甚至被认为是实际的 LEFT JOIN 吗?我是否应该将其更改为使用 LEFT JOIN 而不是我正在遵循的解决方案?
  • @nbayly,检查更新的答案。这应该返回CountryCodeDialCode 开头的所有数据。祝你好运!
  • 现在运行没有错误,但查询逻辑存在一些问题,希望您能提供帮助。它没有输出最具包容性的匹配。例如,对于“7708”的拨号代码,它与俄罗斯的拨号代码“7”而不是更具包容性的“77”哈萨克斯坦相匹配。有什么建议么?我将您的答案标记为正确,因为它确实解决了运行时错误。
  • @nbayly,对不起,但没有让你...因此,它应该返回 {7707177771 等}
  • 如果拨号代码是“7708”,它应该返回“7”(俄罗斯)和“77”(哈萨克斯坦)之间最具包容性的匹配国家代码,在这种情况下应该是“77”更多拨号代码的左侧数字匹配。我希望这能澄清你的疑问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多