Power Query通过OData V4从Dynamics NAV取数时如何仅获取指定列?
问题现象
通过OData V4 Web服务URL从Dynamics NAV数据库取数时,在Excel/PowerBI的Power Query中使用$select筛选特定列,但下载1.4MB数据耗时极长,最终得到的表包含所有列——仅选中列有数据,其余列显示错误/空值,推测Power Query是先拉取全量数据再本地保留指定列。
可行解决方法
1. 直接构造带$select的完整OData URL
跳过Power Query可视化选列步骤,直接在数据源中输入包含筛选参数的完整URL:
https://你的NAV-OData地址/目标实体名?$select=列1,列2,列3
将占位内容替换为实际的服务地址、实体名称和需要的列名,列名用英文逗号分隔。
2. 修改Power Query的M代码强制推送筛选
如果已通过可视化界面加载数据,可修改M代码确保$select参数被正确传递到服务端:
- 打开Power Query编辑器,点击【高级编辑器】
- 找到类似
OData.Feed("https://你的NAV-OData地址/目标实体名")的代码行 - 修改为包含
$select的版本:
OData.Feed("https://你的NAV-OData地址/目标实体名?$select=列1,列2,列3", null, [Implementation="2.0", OmitValues=ODataOmitValues.Nulls])
注意:Implementation="2.0"对应OData V4,此参数会让Power Query严格遵循协议,将筛选逻辑推送到服务端而非本地处理。
3. 检查Dynamics NAV的OData服务配置
确认NAV端允许$select参数生效:
- 登录Dynamics NAV客户端,检查对应Web服务是否启用允许筛选选项
- 确保目标列在OData服务中可访问(未被权限限制)
验证方式
修改后刷新数据时,可通过浏览器开发者工具或Power Query的【诊断】功能查看实际请求URL,确认$select参数存在且正确。此时服务端应仅返回指定列数据,下载速度会明显提升,最终生成的表也只会包含选中列。
内容的提问来源于stack exchange,提问作者Haythem
相关产品推荐
相关产品推荐

