Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel中的SQL查询给出了;未定义的函数名";错误_Sql_Excel_Vba_Ms Access - Fatal编程技术网

Excel中的SQL查询给出了;未定义的函数名";错误

Excel中的SQL查询给出了;未定义的函数名";错误,sql,excel,vba,ms-access,Sql,Excel,Vba,Ms Access,我在MS Access中编写了一个使用MonthName函数的SQL查询。在access中,它可以完美地工作。我将确切的SQL语句复制到一个excel模块中,我经常使用该模块查询数据库。当我运行查询时,excel不断告诉我MonthName是一个未定义的函数名。如果删除MonthName部分,查询将正常运行 好像我错过了一个参考资料或其他什么。。。现在,我正在引用Microsoft ActiveX数据对象库6.0。谁能给我指出正确的方向吗?谢谢 strSQL = "SELECT DISTINCT

我在MS Access中编写了一个使用MonthName函数的SQL查询。在access中,它可以完美地工作。我将确切的SQL语句复制到一个excel模块中,我经常使用该模块查询数据库。当我运行查询时,excel不断告诉我MonthName是一个未定义的函数名。如果删除MonthName部分,查询将正常运行

好像我错过了一个参考资料或其他什么。。。现在,我正在引用Microsoft ActiveX数据对象库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;"
MonthName()
函数仅适用于Access应用程序会话中运行的查询。请参阅中的“从属性表调用或在SQL语句中使用以下VBA函数时将无法工作”要点。在Access应用程序会话中,db引擎可以使用expression服务来使用该沙盒函数

由于无法使用
MonthName
,请尝试使用此
格式
表达式

Format([EXDT], 'mmmm') AS expMonth

奇怪的是,我刚刚在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的评论之后,Office2007和Office2010之间一定发生了一些变化。我在运行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
,这是“Enabled”(参考:)的值。

有趣。我相信OP的话,它失败了。当我从Office2007进行测试时,我在表达式中得到了“-2147217900个未定义的函数‘MonthName’。”我想知道沙箱属性是否与2010有所不同<代码>格式(日期字段“mmm”)可以工作。或者
'mmmm'
表示完整的月份名称,而不是缩写的月份名称。@HansUp我想你是对的,Office 2010一定发生了一些变化。我已将我的答案更新为“精心设计”,效果非常好。谢谢。提供的链接已失效:-/仅供将来参考,您使用的Excel版本是什么?