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

时间:2013-10-28 06:03:20

标签: sql excel ms-access jet-sql

我有一个包含以下查询的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()函数 - 在google中搜索关键词“Jet Sql Replace Function”会给出很多带有相同root的各种问题的引用原因,但我还没有找到一个像样的解决方案......

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

对于它的价值,Access数据库引擎2010(又名“ACE”,“Jet”的后继者)支持Replace()函数 ,可用here 。验证我是否在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:\Users\Public\2003test.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:\__tmp\repl.vbs(6, 1) Microsoft OLE DB Provider for ODBC Drivers: [Microsoft][ODBC Microsoft Access Driver] Undefined function 'Replace' in expression.

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

来测试ACE ODBC连接时
con.Open "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\Users\Public\2003test.mdb;"

......我得到了

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

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