MS Access查询返回#Funktion!错误的排查与解决请求
问题分析与解决方案
错误原因
- 类型不匹配:若
Anschluss字段为数字类型(如单精度/双精度),直接调用InStr(Anschluss, '.')会触发类型错误——InStr要求参数为字符串,旧版Access对类型校验更严格,直接导致#Funktion!。 - 逻辑覆盖不全:原子查询仅处理了「无点号」「点号在第一位」两种场景,完全遗漏了点号在中间的情况(如
2.1),无匹配分支时Switch返回Null,后续LEFT(AnschlussOhnePunkt,1)因Null参数报错。 - 无效参数调用:当点号在第一位时,
Left(Anschluss, Instr(Anschluss, '.')-1)等价于取长度为0的字符串,IsNumeric处理空字符串时易引发异常。
修正后的查询
Select Anschluss, AnschlussOhnePunkt, Switch( IsNull(AnschlussOhnePunkt) Or Len(AnschlussOhnePunkt) = 0 Or Not IsNumeric(AnschlussOhnePunkt), 9999, True, Len(AnschlussOhnePunkt) ) As ordnung From ( Select Anschluss, Switch( IsNull(Anschluss), Null, InStr(CStr(Anschluss), '.') > 0, Left(CStr(Anschluss), InStr(CStr(Anschluss), '.') - 1), True, CStr(Anschluss) ) As AnschlussOhnePunkt From T_Anschluss ) As SubQuery
关键修正点
- 强制字符串转换:所有对
Anschluss的字符串操作均用CStr()包裹,彻底避免数字类型字段导致的类型不匹配问题。 - 完善分支逻辑:子查询新增
True作为默认分支,覆盖所有未匹配场景(如点号在中间的情况),确保AnschlussOhnePunkt不会返回Null。 - 优化外层判断:提前校验
AnschlussOhnePunkt是否为空、Null或非数字,直接返回9999,避免LEFT函数因无效参数报错。
额外说明
若需按数字值排序(而非字符串长度),可将外层ordnung字段修改为:
Switch( IsNull(AnschlussOhnePunkt) Or Len(AnschlussOhnePunkt) = 0 Or Not IsNumeric(AnschlussOhnePunkt), 9999, True, CLng(AnschlussOhnePunkt) ) As ordnung
这样数字类的AnschlussOhnePunkt会按数值大小排序,更符合常规业务需求。
内容的提问来源于stack exchange,提问作者SoulB
相关产品推荐
相关产品推荐

