【问题标题】:Use of Like * Works in MS-Access but Not VBA使用 Like * 在 MS-Access 中有效,但在 VBA 中无效
【发布时间】:2011-08-27 14:16:27
【问题描述】:

我有一个简单的查询,但在 VBA 中使用 LIKE 时遇到问题。我在 VBA 中的 SQL 字符串是:

stsql1 = "Select Top 25 data.* from data where data.Description Like ('*') "

当我在我的 VBA 代码中运行这个 sql 字符串时,我没有返回任何记录,但是如果我将相同的字符串复制/粘贴到 MS Access 的 SQL 视图中的查询中,该查询将返回我期望的值。在 VBA 中使用“Like”语法有什么技巧吗?

如果有帮助,我可以提供额外的代码和数据库的小版本。

【问题讨论】:

  • 应该没有什么区别。请发布您周围的 VBA 代码。
  • 向我们展示足够多的代码上下文,以便我们了解您如何尝试在 VBA 中使用 SQL 语句,以及您在这里处理的是 DAO 还是 ADO。

标签: sql vba ms-access sql-like


【解决方案1】:

对于 SQL,数据库引擎将接受单引号或双引号作为文本分隔符。因此,这 2 个 WHERE 子句中的任何一个都可以使用。

WHERE some_field Like '*'
WHERE some_field Like "*"

然而,VBA 只接受双引号作为文本分隔符,因此您必须使用第二种形式。

关于您的SELECT 声明的另外两点:

Select Top 25 data.* from data where data.Description Like ('*')
  1. TOP [number] 是任意的,没有 ORDER BY 子句
  2. 您不需要在Like 模式周围加上括号...您可以使用Like "*"

如果您的 VBA 代码使用带有 SELECT 语句的 ADO,则必须将通配符从 * 更改为 % ...

WHERE data.Description Like '%'

【讨论】:

    【解决方案2】:

    在 ADO/VBA 中,您必须使用 % 而不是 * 作为通配符。我过去遇到过几次......

    【讨论】:

    • 不是 VBA,而是 ADO 导致您必须使用与在 Access 查询构建器中不同的通配符集。在这里发帖的每个人都应该在这里阅读@onedaywhen 的文章:stackoverflow.com/questions/719115/…
    【解决方案3】:

    意识到这里至少有 2 个(是的,两个!)LIKE 运算符。

    一个是VBA的LIKE操作符。

    另一个是你所连接的数据库的SQL的LIKE操作符。

    SQL 中常用的通配符是 %(表示任意 # 个字符)和 _(表示任意字符之一)。

    还要知道 MS Access 可以打开不是 Access 的数据库;它可以是 Microsoft SQL Server、Oracle 或 IBM DB2。 (顺便说一句,Access 常用的数据库称为 Microsoft JET。)当您在 Access 中创建 Query 对象时,您可能会避开这个事实 - 在这种情况下,您正在使用 JET SQL,即使它是您正在查询的链接表.

    但是,在 VBA 下,当使用 DAO 或 ADO 时,您将直接与数据库系统进行对话,在这种情况下,您必须使用该特定系统的 SQL。

    好的,简短的回答:像 cularis 所说的那样使用 %。

    【讨论】:

    • Access 默认通配符是 * 和 ?,而不是 % 和 _ -- 您必须在 Access 中使用 ANSI 92 模式才能使用 %/_ 通配符,或者使用默认情况下使用 ANSI 92 模式的接口(例如,OLEDB)。所以,基本上,这个答案是错误的。
    • 这个答案还有一个错误:当使用 DAO 或 ADO 时,您可能不会直接与数据库系统发生对话,因为您可以在 DAO 中打开一个 Jet 数据库,然后查询一个链接表(例如链接到 SQL Server)。在这种情况下,除非您创建传递查询,否则您将不得不使用 Jet 语法。
    • @phoog:当然,您对链接表是正确的。但现在是分裂头发的情况;底层数据库系统是利用其链接表功能的 JET(即使其 SQL Server 是存储数据的真正系统)。
    • @David-W-Fenton:以上答案是正确的。 OP 与 LIKE 运算符有问题;并且 OP 表示 cularis 使用“%”的答案解决了这个问题。 SQL 中常用的通配符是 % 和 _。 JET SQL 默认使用的通配符并不常见。
    • 确实,%/_ 可能是正确通配符的唯一方法是原始提问者使用 ADO 而不是默认标准 DAO 与数据库进行代码交互。问题中没有任何迹象表明,尽管 %/_ 有效这一事实是一个非常有力的指标,表明它正在发生什么。在我看来,这显然是一个措辞不当的问题。
    【解决方案4】:

    我无法添加评论,但我认为值得注意的是,即使您正在查询 MS Access,您也必须使用 %

    (例如:Outlook VBA 在 Access 数据库上运行查询。正确的查询是 select * where user like '%bob%',即使此查询如果直接插入 MS Access 查询将不起作用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      相关资源
      最近更新 更多