Power BI中如何在FetchXml函数中传递Null作为文本值
问题根源
你碰到的报错来自两个核心问题:
- 函数定义里
z as text强制要求传文本类型,但Null不属于text类型,直接传Null会触发类型不匹配; - 传空字符串/空格时,生成的FetchXml会带一个无效的
paging-cookie属性,CRM返回的结构异常,导致Power Query无法正确解析成Table,进而抛出"Table转Function"的错误。
修复步骤
1. 放宽函数参数的类型限制
把分页Cookie参数z的类型改成nullable text,允许传入Null值:
GetResults = (z as nullable text, x as number) => let // 动态拼接FetchXml,空Cookie时不生成paging-cookie属性 FetchXmlPart = if z <> null then "paging-cookie=""" & z & """ " else "", FetchXml = "<fetch distinct=""False"" page=""" & Text.From(x) & """ " & FetchXmlPart & ">" & // 这里放你的FetchXml主体字段、过滤条件等内容 "</fetch>", // 调用CRM接口获取数据 Source = Crm.Fetch(FetchXml) in Source
2. 首次调用函数直接传Null
第一次获取数据时,页码传1,Cookie传Null:
FirstPageData = GetResults(null, 1)
3. 自动遍历所有分页(可选)
如果要一次性拉取所有数据,可以加个递归函数自动处理后续分页:
// 递归获取所有分页数据 GetAllPages = (pageNum as number, cookie as nullable text) => let CurrentPage = GetResults(cookie, pageNum), // 提取下一页的分页Cookie NextCookie = try CurrentPage[#"@Microsoft.Dynamics.CRM.fetchxmlpagingcookie"] otherwise null, // 如果有下一页就继续递归,否则返回空表 NextPages = if NextCookie <> null then GetAllPages(pageNum + 1, NextCookie) else #table({}, {}) in // 合并当前页和后续页数据 CurrentPage & NextPages // 调用获取全量数据 AllCRMData = GetAllPages(1, null)
额外注意事项
- 每次拼接完FetchXml后,可以单独输出
FetchXml变量,复制到CRM的Advanced Find里验证格式是否合法,避免因XML语法错误导致返回异常; - 确保
Crm.Fetch返回的始终是Table类型,如果某次调用返回非Table结构,大概率是FetchXml有问题,优先排查XML格式。
内容的提问来源于stack exchange,提问作者BI DATA
相关产品推荐
相关产品推荐

