针对Access 2010 DB的SQL语句不能与ODBC一起使用

时间:2012-09-21 21:00:10

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

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

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

我需要能够搜索带有空格和连字符字符的字符串。以下语句将直接在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。

我需要能够搜索具有字母数字大小写标识符的表,以获取唯一且绑定到生成器的数字标识符(访问中的自动编号)。用户多年来一直使用垃圾箱(使用偶发符号进行不一致的数据输入),因此我唯一的解决方案是从字段值和搜索值中删除除字母数字之外的所有内容,并尝试对其执行LIKE比较。

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

2 个答案:

答案 0 :(得分:4)

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

此行为由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');

但是,如果您的搜索字段值可以在字符串中的任何位置包含任意数量的空格或短划线,那么这种方法就没有用了。对于使查询任务更容易的一些方法,我看起来很难:

  1. 您无法清除存储的值,因为您无法以任何方式更改原始Access数据库。也许你可以创建一个新的Access数据库,导入数据,然后清理它。
  2. 将原始Access数据库设置为SQL Server中的链接服务器,并构建查询以利用SQL Server功能。
  3. 移交。 :-(将更大的数据集提取到PHP客户端代码中,并评估要使用的行与要忽略的行。

答案 1 :(得分:-2)

我不确定你能用ODBC和你的约束来做到这一点。 MS Access driver is limited(按设计; MS希望您使用SQL Server作为后端)。

你能用OLEDB吗?这可能是一种选择。