首页 > 解决方案 > 具有空值处理的 Excel 参数化 PowerQuery

问题描述

尝试使用存储在工作表中的参数值( StartDateEndDate )从 Excel 执行参数化 SQL 查询时遇到错误。当工作表中的EndDate参数留空时,我想将当前日期和时间用作默认值。相反,我收到一条奇怪的错误消息,尽管 Excel 生成的查询似乎有效。我创建了一个基本示例来演示此问题,并发现它是一个可重复的问题。

重现步骤:

  1. 创建一个新的 Excel 工作表
  2. 使用以下值创建一个名为Params的新表:

参数表

  1. 创建一个新的 SQL 查询(数据 -> 获取数据 -> 从数据库 -> 从 SQL Server 数据库)

  2. 输入如下基本查询(注意:对于服务器和数据库,我使用了一个已知良好的 SQL Server 2014 数据库,我已将它用于许多其他类似的查询 - 我相信这不是问题的根源)按下好的:

查询1

  1. 在下一个屏幕上按编辑按钮。转到高级编辑器并输入以下查询,它将用当前本地时间替换一个空的 EndDate 参数:

    let
        Params = Excel.CurrentWorkbook(){[Name="Params"]}[Content]{0},
        StartDate = Params[#"StartDate"],
        EndDate = if Params[#"EndDate"] is null then DateTime.LocalNow() else Params[#"EndDate"],
        Source = Sql.Database("N0049MF1", "Allmine", 
            [Query="SELECT '" 
                & DateTime.ToText(StartDate) & "' AS StartDate, '" 
                & DateTime.ToText(EndDate) & "' AS EndDate"])
    in
        Source
    
  2. 按完成返回查询编辑器。将出现以下横幅:

许可横幅

  1. 按下“编辑权限”按钮会弹出一个对话框,要求设置隐私级别 - 我使用了“组织。

  2. 单击保存按钮将显示以下对话框。您可以看到参数已正确添加到查询中。按运行继续:

在此处输入图像描述

  1. 至此,查询正常运行,返回如下结果:

好结果

  1. 接下来,我尝试删除Params表的 EndDate 单元格中的日期并刷新查询。这一次,当 Native Database Query 权限对话框出现时,EndDate 被正确设置为当前日期和时间,表明 M 代码工作正常:

具有 NULL EndDate 的本机查询

  1. 按下运行按钮后,对话框消失,但立即重新出现,没有错误消息。反复按下“运行”按钮会关闭对话框,每次都会快速重新出现。

  2. 按取消按钮显示以下错误:

[权限错误] EvaluateNativeQueryUnpermitted 失败:查询 'SELECT '1/1/2018 12:00:00 AM' AS StartDate, '11/8/2018 5:07:56 PM' AS EndDate' 未被批准执行。

结论

该查询似乎是有效的,并且权限似乎设置正确。将 EndDate 更改回有效日期会导致查询恢复正常工作,但删除日期会导致再次失败。使用 SQL Server 分析器,我可以看到当StartDateEndDate参数都存在时查询已成功执行,但如果EndDate参数为空,则甚至永远不会将查询发送到数据库。

这真的是一个权限问题吗?M码有问题?Excel中的错误?

标签: excelpowerqueryexcel-2016m

解决方案


我无法重现该问题(该查询对我有用),但我很确定这实际上是一个权限问题。

看看关闭隐私等级是否可以修复它。

选项和设置

隐私级别


推荐阅读