MS Access 很长并出现“表达式过长”错误

Posted

技术标签:

【中文标题】MS Access 很长并出现“表达式过长”错误【英文标题】:MS Access Very Long and Getting "Expression Too Long" Error 【发布时间】:2011-12-09 08:49:04 【问题描述】:

我有一个带有大约 50 个“OR”条件且全部带有“Like”运算符的 SQL。我从 VB Access 代码执行此 SQL。

但是查询失败,说“Expression Too Long”错误(我认为主要是因为它在查询网格中超过了 1024 个字符。

SELECT * 
  FROM <My Database> 
 WHERE (
        [Title] = '' 
        OR [Title] = '' 
        OR [Title] = '' 
        OR [Title] = '' 
        OR [Title] = '' 
        OR [Title] = '' 
        OR [Title] = '' 
        OR [Title] = '' 
        OR [Title] = '' 
        OR [Title] = ''
       ) 
       AND (
            [TITLE] LIKE '*Afghanistan*' 
            OR [TITLE] LIKE '*Term1*' 
            OR [TITLE] LIKE '*Term2*' 
            OR [TITLE] LIKE '*Term3*' 
            OR ..<around 40 like these> 
            OR [COUNTRY] LIKE '*Country1*' 
            OR ...<around 40 like these>
           );

关于如何解决此问题的任何想法或建议?

【问题讨论】:

你能把查询的SQL贴出来吗? 嗨 iDevlp,刚刚添加了代码示例.. 不要在帖子上签名,如果您想使用真实姓名,请在用户个人资料页面更改您的用户名。 :) 【参考方案1】:

建议:将参数值插入基本“暂存”表(可能在另一个临时数据库中)并使用EXISTS 创建这些表的seni 连接。使用ALIKE(而不是LIKE),它始终使用标准SQL 通配符(%)。

SELECT * 
  FROM MyTable AS m
 WHERE EXISTS (
               SELECT * 
                 FROM MyExactParams AS x
                WHERE m.Title = x.Title
              )
       AND (
            EXISTS (
                    SELECT * 
                      FROM MyPatternParams AS p
                     WHERE m.Title ALIKE '%' + p.Title + '%'
                   )
            OR EXISTS (
                       SELECT * 
                         FROM MyPatternCountries AS c
                        WHERE m.Country ALIKE '%' + c.Country + '%'
                      )
           );

【讨论】:

MS-Access SQL 使用 * 和 ?作为通配符,而不是 T-SQL 的 % 和 _。 @webturner:你错了。再看一遍,"Use ALIKE (rather than LIKE)..." 嗨 onedaywhen - 我只是没有话要感谢你..你真是太棒了..也感谢 Webturner。他昨天解决了我的疑惑。非常感谢你们...... 所以不要使用非标准的*? 通配符,您可以使用非标准的ALIKE 关键字,进展并不顺利。谢谢指正。【参考方案2】:

首先感谢您将此作为单独的问题发布到your previous one。这是正确的做法:-)

重复的OR [Title] = '' 应该消失,它们只是杂乱无章,你只需要其中一个,假设你真的需要匹配一个空标题。

第二,你真的需要通配符吗?如果数据库设计得好,名为Country 的字段应该只包含国家/地区的名称,所以你可以说[Country]='Afghanistan'

如果您不需要通配符,那么 IN 关键字会很有用:您可以使用 [Country] IN ('Afghanistan', 'Term1', 'Term2', 'Term3') 检查多个选项

onedaywhen 的建议非常好(我+1),但我担心您的代码指向一些设计问题。你想用这段代码做什么:找到一切?验证输入?根据用户选择查找?

【讨论】:

您好 Webturner,感谢您的 cmets。它们非常有价值。我只是喜欢你们所做的无私帮助。要回答您的问题,是的..,实际上需要通配符。要求相当复杂。我必须搜索与任何国家/地区或来自该国家/地区的任何字符串相关的字符串。例如。来自世界各地寻找“IPAD in ASia”的人或寻找“IPAD”的亚洲人。

以上是关于MS Access 很长并出现“表达式过长”错误的主要内容,如果未能解决你的问题,请参考以下文章

在 MS Access 2003 上出现错误 (3163)

将大数据表复制到 MS Access 表 C#

MS Access 无法在实体和桥接表之间创建一对多关系

如何使用 SQL 在 MS Access 数据库中“显示表”?

MS Access表与多个外键在同一表中的关系。

编译代码后出现 MS ACCESS 错误