针对 Access 2010 DB 的 SQL 语句不适用于 ODBC

标签 sql ms-access odbc ms-access-2010

我试图对 Access DB 运行一个简单的语句来查找记录。

记录中的数据验证非常糟糕,我无法对其进行 sanitizer 。意思是,它必须保持原样。

我需要能够搜索删除了空格和连字符的字符串。以下语句将直接在 Access 2010 中起作用:

select * from dummy where Replace(Replace([data1],' ',''),'-','') = 'ABCD1234';

通过 PHP 从 ODBC 连接运行它不会。它产生以下错误:
SQL error: [Microsoft][ODBC Microsoft Access Driver] Undefined function 'Replace' in expression., SQL state 37000 in SQLExecDirect

在运行该函数的数据库中创建查询并尝试间接搜索其值会导致相同的错误:
select * from dummy_indirect where Expr1 = 'ABCD1234';

我尝试使用现有的两个 ODBC 驱动程序。 ODBCJR32.dll (03/22/2010) 和 ACEODBC.dll (02/18/2007)。据我所知,这些应该是最新的,因为它是与完整的 Access 2010 和 Access 2010 数据库引擎一起安装的。

欢迎任何有关如何解决此错误并达到相同效果的想法。请注意,我无法在方式、形状或形式上更改数据库。该间接查询是在另一个 mdb 文件中创建的,该文件具有从原始数据库链接的原始表。

* 更新 *

OleDB 并没有真正影响任何东西。
$dsn= "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\dummy.mdb;";

我也没有尝试将它用作网络后端。我不是施虐受虐狂。

有一个我必须支持的遗留系统确实使用 Access 作为后端。数据从其他旧系统填充到那里,我必须将其集成到更现代的系统中。因此,使用运行在支持遗留系统的服务器上的 Apache/PHP 创建 API。

我需要能够搜索具有字母数字大小写标识符的表,以获取唯一且与生成器相关联的数字标识符( Access 中的自动编号)。用户多年来一直使用它作为垃圾箱(不一致的数据输入与零星符号),所以我唯一的解决方案是从字段值和搜索值中删除除字母数字之外的所有内容,并尝试对其执行 LIKE 比较。

如果不支持 Access 的 replace() ,我可以使用哪些 ODBC 兼容函数进行相同类型的比较?

最佳答案

回顾一下,Access 数据库引擎将无法识别 Replace()除非您的查询是从 Access 应用程序 session 中运行的。任何来自 Access 外部的尝试都将触发“未定义函数”错误消息。您无法通过从 ODBC 切换到 OleDb 作为连接方法来避免错误。而且你也不能欺骗引擎使用 Replace()通过将其隐藏在单独的查询中(在同一个或另一个 Access 数据库中)并将该查询用作主查询的数据源。

此行为由 Access' sandbox mode 决定.该链接页面包括默认沙箱模式下可用的功能列表。该页面还介绍了如何更改沙箱模式。如果您绝对必须拥有 Replace()可用于您的查询,也许最低设置 (0) 将允许它。但是,我不建议您这样做。我自己从来没有做过,所以不知道什么后果。

至于 Replace() 的替代品,这将有助于了解您正在搜索的值的可变性。如果空格或破折号只出现在一个或几个一致的位置,你可以用 Like 做一个模式匹配。表达。例如,如果搜索字段值由 4 个字母、一个可选的空格或破折号组成,后跟 4 个数字,则 WHERE这样的子句应该适用于“ABCD1234”的变体:

SELECT * FROM dummy
WHERE
       data1 = 'ABCD1234'
    OR data1 Like 'ABCD[- ]1234';

另一种可能性是与值列表进行比较:
SELECT * FROM dummy
WHERE
       data1 IN ('ABCD1234','ABCD 1234','ABCD-1234');

但是,如果您的搜索字段值可以在字符串中的任何位置包含任意数量的空格或破折号,那么这种方法就不好用了。我会很努力地寻找某种方法来简化查询任务:
  • 您无法清除存储的值,因为您被禁止以任何方式更改原始 Access 数据库。也许您可以创建一个新的 Access 数据库,导入数据并进行清理。
  • 将原始 Access 数据库设置为 SQL Server 中的链接服务器,并构建您的查询以利用 SQL Server 功能。
  • 投降。 :-( 将更大的数据集拉入您的 PHP 客户端代码,并评估要使用的行与要忽略的行。
  • 关于针对 Access 2010 DB 的 SQL 语句不适用于 ODBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12538094/

    相关文章:

    excel - 从 Excel 导入数据进行 Access 时,外部数据库驱动程序出现意外错误 (1)

    sql-server - 服务器对象在 SQL Server Management Studio 中不可用

    mysql - 在 Visual Studio 2008 上使用 MySQL

    mysql - SQL概念: nested loop

    php - 即时更改 mysql 列类型

    ms-access - 是否可以从 VB6 应用程序运行 VBA 文件?

    php - ODBC_Exec 正常工作时出现 PDO 错误

    mysql - 从选择中选择 *

    sql - CASE SQL 返回 Null

    sql - 如何在 Access 表中的文本字段前添加零