Power BI NativeQuery-无法从类型转换为文本

时间:2020-08-20 15:06:06

标签: sql sql-server powerbi

我创建了具有两个参数的SQL存储过程: DateFrom DateTo (在我的sql过程中均为DATE类型)。

我想在Power Query Editor中编写本机查询,因此首先我在其中创建了两个日期参数(类型:日期/时间): StartDate EndDate 。不幸的是,当我尝试编写本机查询时,会发生以下错误:“无法从记录类型转换为文本数据”。你知道这是怎么回事吗?

这是过程调用:

enter image description here

和我的M代码:

let
    Source = Sql.Database("Server\12", "Base1"),

        Query = Value.NativeQuery(
            Source, 
            [Query="EXEC [dbo].[sp_Sales] @DateFrom = '" & Date.ToText(StartDate) & "', @DateTo = '" & Date.ToText(EndDate) & "'"])
  
in 
 Query

我还尝试了更多的“:

let
    Source = Sql.Database("Server\12", "Base1"),

        Query = Value.NativeQuery(
            Source, 
            [Query="EXEC [dbo].[sp_Sales] @DateFrom = """ & Date.ToText(StartDate) & """, @DateTo = """ & Date.ToText(EndDate) & """"])
  
in 
 Query

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。关键是在这里使用NativeQuery。步骤如下:

  1. 使用参数(例如 DateFrom DateTo )创建存储过程,并将数据导入Power BI
  2. 在PowerQuery编辑器中创建2个参数。假设 startDate endDate 。设置一些默认值:

enter image description here

  1. 转到“高级编辑器”以更改M代码。正确的方法如下:
let
    Source = Sql.Database("ServerName\12", "Base2"),
    Query = Value.NativeQuery(
            Source, 
            "EXEC [dbo].[storedProcedure_XYZ] @DateFrom = '" & Date.ToText(startDate) & "', @DateTo = '" & Date.ToText(endDate) & "'")
    
in
    
Query    

@DateFrom @DateTo 是SQL参数,必须按照我上面显示的方式将PQ参数(startDate和endDate)分配给它们。

重要的是,您不能将EXEC ....语句放在“ SQL语句字段”中以导入数据(当然,您需要填写服务器名称等)。 我的意思是,您可以先导入原始数据(请参见第1点),但此后此字段应保持为空。现在,整个工作由您的M代码使用本机查询完成。

enter image description here

  1. 在“高级编辑器”中单击“确定”(请参阅​​第3点),您的SQL查询将与参数一起执行。现在您可以在Power BI中看到刷新的数据。

  2. 转到Power BI中的可视化层。单击此小箭头向下的“转换数据”,然后选择“编辑参数”:

enter image description here

  1. 现在输入参数值。

enter image description here

单击“确定”就可以了!现在将根据您从PBI可视化层传递的参数来刷新SQL查询,所有刷新的数据将被加载到PBI中的数据模型中-这意味着您的可视化将自动使用新数据进行更新。它不再是状态-现在是动态的:)

关于它的另一个好处是,从SQL导入到PQ的基表将不会更改为函数(通常是在对查询进行参数化时)-即使您在基查询中使用参数,它仍然保留在表中。将数据加载到PBI数据模型中所产生的问题更少,所有列都保留在原处,并且没有任何列被删除。它对我来说很完美。

我还关闭了本机查询批准(转到“选项”>“安全性”),因为PBI不会征求您执行查询的许可。当您使用本机查询时,这是一件好事(请记住安全性问题,在这里很重要)。

enter image description here

相关问题