Power Query动态获取按日期命名SQL表触发Expression.Error密钥不匹配问题
Power Query动态拼接每日SQL表名报错解决方案
这个报错的本质是Power Query在数据库的dbo schema下找不到你拼接出来的对应日期的表,下面是具体原因和修复方案:
报错原因
- 最常见场景:执行代码的当天,
dboschema下还没有生成对应日期的MICRINFO开头的表,跨天凌晨表同步延迟、节假日不生成当日表都会触发这个报错 - 时区不匹配:
DateTime.LocalNow()取的是本地机器的时间,如果数据库服务器时区和本地不一致,会导致拼接的日期和实际数据库内的表日期差1天 - 表名规则不匹配:确认数据库内的表名前缀是否完全为全大写的
MICRINFO,没有下划线、空格等隐藏字符
修复方案
可以直接使用下方兼容容错的优化代码,会自动查找近3天内存在的最新对应表,避免单天表不存在的报错:
let Source = Sql.Database("TEST", "TEST"), // 若数据库表按UTC时间生成,将下方DateTime.LocalNow()改为DateTime.UtcNow() currentDate = DateTime.Date(DateTime.LocalNow()), // 生成近3天的日期候选,兼容表延迟、节假日不生成表的场景 dateCandidates = List.Dates(Date.AddDays(currentDate, -2), 3, #duration(1,0,0,0)), // 转换为符合规则的表名候选 tableNameCandidates = List.Transform(dateCandidates, (d) => "MICRINFO" & Date.ToText(d, "yyMMdd")), // 筛选出第一个真实存在的表 targetTableName = List.First(List.Select(tableNameCandidates, (name) => try Source{[Schema="dbo", Item=name]}[Data] otherwise null <> null)), // 提取目标表数据 result = Source{[Schema="dbo", Item=targetTableName]}[Data] in result
注意事项
- 如果不需要自动 fallback 到历史表,只需要校验当日表是否存在,可以自行调整
dateCandidates的日期范围 - 若表的命名规则有调整,修改
tableNameCandidates的拼接逻辑即可匹配
内容的提问来源于stack exchange,提问作者btava001
相关产品推荐
相关产品推荐

