【发布时间】:2012-09-21 21:00:09
【问题描述】:
我正在尝试对 Access DB 运行一个简单的语句来查找记录。
记录中的数据验证非常糟糕,我无法对其进行清理。意思是,它必须保持原样。
我需要能够搜索删除了空格和连字符的字符串。以下语句适用于 Access 2010 direct:
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 文件中创建的,该文件具有从原始 DB 链接的原始表。
* 更新 *
OleDB 并没有真正影响任何事情。
$dsn= "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\dummy.mdb;";
我也没有尝试将其用作 Web 后端。我不是施虐狂。
有一个我必须支持的旧系统确实使用 Access 作为后端。数据来自其他旧系统,我必须将其集成到更现代的系统中。因此,使用 Apache/PHP 创建一个 API,该 API 在支持遗留系统的服务器上运行。
我需要能够搜索具有字母数字大小写标识符的表,以获取唯一且与生成器相关联的数字标识符(访问中的自动编号)。用户多年来一直将其用作垃圾箱(数据输入不一致,带有零星符号),因此我唯一的解决方案是从字段值和搜索值中删除除字母数字之外的所有内容,并尝试对其执行 LIKE 比较。
如果不支持访问的 replace(),存在哪些 ODBC 兼容函数可以用来进行相同类型的比较?
【问题讨论】:
-
Access db 引擎支持所有应用程序上下文中的一组标准函数。其他函数(例如
Replace())和用户定义的函数(例如您的dummy_indirect())仅在 Access 应用程序实例中受支持。当您使用 ODBC 访问您的数据库时,Access 本身没有运行......所以这些功能不可用。 -
dummy_indirect 是一个查询。 ODBC 支持哪些功能?在任何地方都很难找到列表。有没有类似replace的东西?
-
抱歉,我对 dummy_indirect 感到困惑。但是,如果它是另一个使用
Replace()的查询,则 db 引擎仍然无法识别该函数,除非它从 Access 应用程序实例中运行。
标签: sql ms-access odbc ms-access-2010