本机查询上的查询折叠

在 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 的函数的 forth 参数使用可选记录。

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

注意

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

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

此 SQL 语句生成只有三行和两列的表。

针对目标数据库计算的本机查询

测试查询折叠

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

筛选 DepartmentID 列以仅包含不等于两个的值

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

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

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

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

本机查询环绕在另一个 SELECT 语句周围,以创建原始查询的子查询。 根据使用的转换和提供的本机查询,Power Query将尽最大努力创建最佳查询。

筛选行步骤的查询计划

提示

对于由于查询折叠无法实现而出现错误的情况,建议尝试将步骤验证为原始本机查询的子查询,以便在可能存在任何语法或上下文冲突时检查。