Power Query数据源错误处理:遇错生成空表并跳过后续步骤
解决Power Query中SQL表不存在时的错误处理问题
可以通过M语言的try...otherwise结构实现需求,当目标表不存在时返回空表(或null),并跳过后续转换步骤。以下是具体实现方式:
核心代码修改
假设你原来的查询代码类似这样:
let Source = Sql.Database("tcp:sqlsvr-prod.public.12345.database.windows.net, 3342", "sqldb-reporting-prod"), TargetTable = Source{[Schema="123_outcomes", Item="1234_outcome"]}[Data] in TargetTable
修改为带有错误处理的版本:
let Source = Sql.Database("tcp:sqlsvr-prod.public.12345.database.windows.net, 3342", "sqldb-reporting-prod"), // 尝试获取目标表,失败则返回与原表结构一致的空表 TargetTable = try Source{[Schema="123_outcomes", Item="1234_outcome"]}[Data] otherwise #table( type table [/* 这里填入原表的列名和类型,例如: OutcomeID=number, OutcomeName=text, CreateDate=datetime */], {} ), // 后续转换步骤:仅当表非空时执行原有逻辑 ProcessedData = if Table.IsEmpty(TargetTable) then TargetTable else /* 替换成你原来的转换代码,比如: Table.TransformColumns(TargetTable, {{"CreateDate", Date.From}}) */ in ProcessedData
关键细节说明
try...otherwise的作用:try块尝试执行获取表的操作,若触发"对象不存在"这类错误,会直接执行otherwise后的代码,返回预设的空表。- 空表结构的选择:
- 如果你清楚原表的列结构,最好定义与原表完全一致的空表(如示例中注释的列定义),这样后续依赖列的步骤不会因为列缺失报错。
- 若不确定结构,可简化为
#table({}, {})生成无列的空表,但需确保后续转换步骤能兼容这种情况。
- 跳过后续转换:通过
if Table.IsEmpty(TargetTable)判断,空表时直接返回,非空时才执行原有转换逻辑,避免无效操作和额外报错。
可选:返回null替代空表
如果更倾向返回null而非空表,可修改otherwise部分:
TargetTable = try Source{[Schema="123_outcomes", Item="1234_outcome"]}[Data] otherwise null, ProcessedData = if TargetTable = null then null else /* 原有转换逻辑 */
注意:返回null时,后续步骤需额外处理null值,否则可能触发新的报错,因此空表通常是更安全的选择。
内容的提问来源于stack exchange,提问作者Renier Wessels
相关产品推荐
相关产品推荐

