我在MS Access中编写了一个使用MonthName函数的SQL查询。在访问它完美无瑕。我将确切的SQL语句复制到我经常用于查询数据库的Excel模块中。当我运行查询时,excel不断告诉我MonthName是一个未定义的函数名。如果我删除MonthName部分,查询运行正常。
好像我错过了一个引用或什么......现在,我正在引用Microsoft ActiveX Data Objects Library 6.0。谁能指出我正确的方向?感谢
strSQL = "SELECT DISTINCT Customers.CustomerName, Employees.EmployeeName, [Policy data revised].EXDT, MonthName(Month([EXDT])) AS expMonth
FROM (([Service Team table]
INNER JOIN Customers
ON [Service Team table].CustID = Customers.CustID)
INNER JOIN Employees
ON [Service Team table].EmployeeID = Employees.EmployeeID)
INNER JOIN [Policy data revised]
ON Customers.CustID = [Policy data revised].CustID
WHERE ((([Service Team table].RoleExtension)='2. Underwriting Assistant')
AND (([Policy data revised].EXDT)
BETWEEN #" & minExpDt & "# AND #" & maxExpDt & "#))
ORDER BY [Policy data revised].EXDT ASC;"
答案 0 :(得分:4)
MonthName()
函数仅适用于在Access应用程序会话中运行的查询。请参阅“以下VBA函数在从属性表调用或在SQL语句中使用时将无效项目符号位于About Microsoft Jet Expression Service sandbox mode。在Access应用程序会话中,db引擎可以使用表达式服务来使用该沙盒功能。
由于您无法使用MonthName
,请尝试使用此Format
表达式。
Format([EXDT], 'mmmm') AS expMonth
答案 1 :(得分:1)
奇怪,我刚刚在Excel 2010(64位)中尝试了以下代码,它对我有用:
Sub foo()
'' Reference: "Microsoft ActiveX Data Objects 6.0 Library"
Dim con As ADODB.Connection, rst As ADODB.Recordset
Set con = New ADODB.Connection
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Gord\Desktop\Database1.accdb;"
Set rst = New ADODB.Recordset
rst.Open "SELECT MonthName(Month([BookingStart])) FROM Payment_tbl", con, adOpenStatic, adLockOptimistic
Debug.Print rst(0).Value
rst.Close
Set rst = Nothing
con.Close
Set con = Nothing
End Sub
继HansUp的评论之后,Office 2007和Office 2010之间的某些内容必定已经发生了变化。我在运行Office 2010的32位计算机上运行了另一个测试,上面的代码针对Access 2000 .mdb文件运行,同时使用这两个文件。 ..
Provider=Microsoft.ACE.OLEDB.12.0;
...和...
Provider=Microsoft.Jet.OLEDB.4.0;
我还检查了......
下的SandBoxMode
注册表值
HKLM\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines
...它是3
,这是“已启用”的值(参考:here)。