无法公开具有内联函数的 MS 访问查询



我有一个包含以下查询的 MS Access 2003 数据库:

SELECT Replace(Trim(TABLE_A.Field_01), "XXX", "YYY") AS FLD01 FROM TABLE_A

如果我使用此 Access 数据库使用 Excel 执行"导入数据",则找不到数据库中定义的此查询的名称。

如果我通过删除 Trim 函数来更改查询,那么我可以在 Excel 中看到查询。

SELECT RTrim(LTrim(TABLE_A.Field_01)) AS FLD01 FROM TABLE_A

没有人有过类似的经历?我认为可以应用于MS Access中的查询的函数类型存在限制。

看起来MS Jet SQL存在问题,

它不支持Replace()函数 - 在谷歌中搜索关键字"Jet Sql 替换函数"会给出很多参考,其中包含具有相同根本原因的各种问题,但我还没有找到一个像样的解决方案......

Trim(

) 函数不是 SQL 的一部分(驻留在 VBA 中。字符串库),因此无法在 MS Access 之外调用。

因此,您可以使用任何SQL函数,但不能使用"外部"函数。

值得一提的是,此处提供的 Access 数据库引擎 2010(又名"ACE","Jet"的后继者)支持 Replace() 函数。若要验证我是否在 Access 2003 数据库文件中创建了名为 [SomeTable] 的表,请执行以下操作:

ID  s
--  ----------------------------
1   Everybody loves tofu!
2   Nobody really liked Raymond.

。我创建了一个名为 [stockReplaceQuery] 的已保存查询:

SELECT ID, Replace([s],"tofu","bacon") AS s1
FROM SomeTable;

当我使用以下 VBScript 测试 Jet ODBC 连接时

Option Explicit
Dim con, rst
Set con = CreateObject("ADODB.Connection")
con.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:UsersPublic2003test.mdb;"
Set rst = CreateObject("ADODB.Recordset")
rst.Open "SELECT s1 FROM stockReplaceQuery WHERE ID = 1", con
WScript.Echo rst(0).Value
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing

。我得到了

C:__tmp>cscript /nologo repl.vbs
C:__tmprepl.vbs(6, 1) Microsoft OLE DB Provider for ODBC Drivers: [Microsoft][ODBC Microsoft Access Driver] Undefined function 'Replace' in expression.

当我通过将 con.Open 行更改为

con.Open "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:UsersPublic2003test.mdb;"

。我得到了

C:__tmp>cscript /nologo repl.vbs
Everybody loves bacon!

可能值得尝试安装ACE引擎/驱动程序,看看是否有帮助。

最新更新