use*_*141 5 sql ms-access odbc ms-access-2010
我正在尝试对Access DB运行一个简单的语句来查找记录.
记录中的数据验证非常糟糕,我无法对其进行消毒.意思是,它必须保持原样.
我需要能够搜索带有空格和删除连字符的字符串.以下语句将直接在Access 2010中使用:
select * from dummy where Replace(Replace([data1],' ',''),'-','') = 'ABCD1234';
Run Code Online (Sandbox Code Playgroud)
通过PHP从ODBC连接运行它不会.它会产生以下错误:
SQL error: [Microsoft][ODBC Microsoft Access Driver] Undefined function 'Replace' in expression., SQL state 37000 in SQLExecDirect
Run Code Online (Sandbox Code Playgroud)
在运行该函数的数据库中创建查询并尝试间接搜索其值会导致相同的错误:
select * from dummy_indirect where Expr1 = 'ABCD1234';
Run Code Online (Sandbox Code Playgroud)
我试图使用两个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;";
Run Code Online (Sandbox Code Playgroud)
我也没有尝试将它用作网络后端.我不是一个虐恋者.
我必须支持遗留系统,它确实使用Access作为后端.数据从其他旧系统填充,我必须将其集成到更现代的系统中.因此,在支持遗留系统的服务器上运行的Apache/PHP创建API.
我需要能够搜索具有字母数字大小写标识符的表,以获得唯一的数字标识符并绑定到生成器(访问中的自动编号).用户多年来一直使用垃圾箱(使用偶发符号进行不一致的数据输入),因此我唯一的解决方案是从字段值和搜索值中删除除字母数字之外的所有内容,并尝试对其执行LIKE比较.
如果不是支持访问的replace(),我可以使用哪些ODBC兼容函数做同样的比较?
概括地说,Replace()除非您在Access应用程序会话中运行查询,否则Access db引擎将无法识别该功能。来自外部Access的任何尝试都将触发该“未定义的功能”错误消息。通过从ODBC切换到OleDb作为连接方法,您无法避免该错误。而且,您也无法Replace()通过将引擎隐藏在单独的查询中(在同一数据库或另一个Access数据库中)并将该查询用作主查询的数据源来欺骗该引擎。
此行为由Access的沙盒模式决定。该链接页面包含默认沙箱模式下可用的功能列表。该页面还描述了如何更改沙盒模式。如果您绝对必须有Replace()可用于查询的内容,则最低设置(0)可能会允许它。但是,我不建议您这样做。我自己从未做过,所以对后果一无所知。
至于的替代方法Replace(),这将有助于您了解所搜索值的可变性。如果空格或破折号仅出现在一个或几个一致的位置,则可以对Like表达式进行模式匹配。例如,如果搜索字段值由4个字母,一个可选的空格或破折号,后跟4个数字组成,则这样的WHERE子句应该适用于“ ABCD1234”的变体:
SELECT * FROM dummy
WHERE
data1 = 'ABCD1234'
OR data1 Like 'ABCD[- ]1234';
Run Code Online (Sandbox Code Playgroud)
另一种可能性是与值列表进行比较:
SELECT * FROM dummy
WHERE
data1 IN ('ABCD1234','ABCD 1234','ABCD-1234');
Run Code Online (Sandbox Code Playgroud)
但是,如果您的搜索字段值可以在字符串中的任意位置包含任意数量的空格或破折号,那么这种方法就不好了。而且,通过某种方式使查询任务变得更容易,我会非常困难:
Ton*_*ile -2
我不确定您是否可以使用 ODBC 和您的限制来做到这一点。MS Access 驱动程序是有限的(按照设计;MS 希望您使用 SQL Server 作为后端)。
可以使用OLEDB吗?这可能是一个选择。