本机查询上的查询折叠

在 Power Query 中,可以定义本机查询,并针对数据源运行它。 使用本机数据库查询从数据库导入数据文章中介绍了如何使用多个数据源执行此过程。 但是,通过使用本文中所述的过程,查询将无法利用后续查询步骤中的任何查询折叠。

本文演示了一种替代方法,即使用 Value.NativeQuery 函数针对数据源创建本机查询,并在查询的后续步骤中保持查询折叠机制的活动状态。

注意

建议阅读有关查询折叠查询折叠指示器的文档,以便更好地了解本文中使用的概念。

支持的数据连接器

后文介绍的方法适用于以下数据连接器:

从数据源连接到目标

注意

为了展示此过程,本文使用 SQL Server 连接器和 AdventureWorks2019 示例数据库。 不同的连接器可能会有不同的体验,但本文展示了如何在受支持的连接器的本机查询上启用查询折叠功能的基本原理。

连接到数据源时,请务必连接到要在其中执行本机查询的节点或级别。 在本文示例中,该节点是服务器中的数据库级别。

“连接设置”对话框,用于连接到 SQL Server 本地实例上的 AdventureWorks2019 数据库。

定义连接设置并提供连接的凭据后,你将将进入数据源的导航对话框。 在该对话框中,将看到可以连接到的所有可用对象。

在此列表中,需要选择运行本机查询的对象(也称为目标)。 在本示例,该对象是数据库级别。

在 Power Query 的导航器窗口中,右键单击导航器窗口中的数据库节点,然后选择“转换数据”选项。 选择此选项会创建数据库整体视图的新查询,这就是运行本机查询的目标。

用户右键单击导航器中的数据库节点后显示的图像,其中突出显示“转换数据”菜单项。

查询进入 Power Query 编辑器后,“已应用的步骤”窗格中应仅显示“”步骤。 此步骤包含一个表,其中包含数据库中所有可用对象,类似于导航窗口中的显示方式。

仅使用源步骤进行查询。

使用 Value.NativeQuery 函数

此过程的目标是执行以下 SQL 代码,并使用可折叠回源的 Power Query 应用更多转换。

SELECT DepartmentID, Name FROM HumanResources.Department WHERE GroupName = 'Research and Development'

第一步是定义正确的目标,在本例中即为运行 SQL 代码的数据库。 步骤具有正确的目标后,就可以选择该步骤(在本例中为“已应用的步骤中的”),然后选择编辑栏中的 fx 按钮添加自定义步骤。 在此示例中,将 Source 公式替换为以下公式:

Value.NativeQuery(Source, "SELECT DepartmentID, Name FROM HumanResources.Department WHERE GroupName = 'Research and Development'  ", null, [EnableFolding = true])

此公式最重要的组成部分是在函数的第四个参数中使用可选记录,该函数的 EnableFolding 记录字段设置为 true

使用 Value.NativeQuery 函数和显式 SQL 查询的新自定义步骤公式。

注意

可以从官方文档文章中详细了解 Value.NativeQuery 函数。

输入公式后,将显示一条警告,要求为特定步骤启用本地查询。 可以单击“继续”评估此步骤。

此 SQL 语句会生成仅包含三行和两列的表。

针对目标数据库评估的本机查询。

测试查询折叠

若要测试查询的查询折叠,可以尝试将筛选器应用于任何列,并查看已应用步骤部分中的查询折叠指示器是否显示该步骤已折叠。 在这种情况下,可以筛选 DepartmentID 列,使其值不等于 2。

筛选“DepartmentID”列,使其值不等于 2。

添加此筛选器后,可以检查查询折叠指示器是否仍显示在此新步骤中发生了查询折叠。

筛选器步骤显示为折叠回“已应用的步骤”部分中的数据源。

若要进一步验证要发送到数据源的查询,可以右键单击“筛选的行”步骤,然后选择读取“查看查询计划”选项,检查该步骤的查询计划。

在查询计划视图中,可以看到界面左侧名称为 Value.NativeQuery 的节点,该节点具有读取“查看详细信息”的超链接文本。 可以单击此超链接文本查看要发送到 SQL Server 数据库的确切查询。

本机查询包裹在另一个 SELECT 语句中,可创建原始查询的子查询。 Power Query 会根据所使用的转换和所提供的本地查询,尽力创建最佳查询。

筛选的行步骤的查询计划。

提示

如果因为无法折叠查询而出现错误,建议尝试将步骤作为原始本地查询的子查询进行验证,以检查是否存在任何语法或上下文冲突。