【问题标题】:Reference an excel cell in a Where statement to change the Query在 Where 语句中引用 Excel 单元格以更改查询
【发布时间】:2021-08-19 06:28:54
【问题描述】:

我想使用 Excel 单元格来更改 Where 语句中的参考数据,这样我就不必继续执行电源查询来更改语句。

我想在同一工作簿的sheet1 中引用cell B7 而不是下面代码中的31690

这可能吗?如果是这样怎么办? 提前致谢。

WHERE ORDERDATE >= @Month13#(lf)#(tab)and STOCKCODE is not null#(lf)#(tab)AND SALESORD_HDR.ACCNO = '31690'

【问题讨论】:

    标签: excel powerquery


    【解决方案1】:

    也许是这样的?

    要使这种方法发挥作用,您需要确保您的电子表格有一个表格,并且表格的范围从 A1 开始,并超出了其中包含值的单元格(在本例中为 B7)。这是一个例子:

    我首先使用名为 Table1 的表创建此电子表格:

    然后,我在 Power Query 中使用 Table1 作为源。

    请注意,对于上表,第 7 行是第 6 行。这是因为列标题在 Power Query 中没有行号。行编号的这种变化对于查找目标单元格很重要。

    然后我添加了一些自定义 M 代码。此代码首先从列名列表中提取第二列的名称。 (因为第二列将是电子表格的 B 列。)然后它使用第二列的名称创建该列值的表,然后从中提取第六行条目。 (因为第六行条目将是电子表格中的第七行条目。)请注意,{1} 指向第二列,{5} 指向第六行。这是因为 Power Query 索引从 0 开始。

    我进入高级编辑器并将步骤从自定义重命名为 DateVariable:

    DateVariable = Table.Column(Table1_Table, Table.ColumnNames(Table1_Table){1}){5},

    然后,我添加了一些自定义 M 代码,以将 DateVarable 与您的 SQL 语句的其余部分连接起来作为示例:

    这是我的 M 代码:

    let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        DateVariable = Table.Column(Source, Table.ColumnNames(Source){1}){5},
        SQL_Statement = "WHERE ORDERDATE >= @Month13#(lf)#(tab)and STOCKCODE is not null#(lf)#(tab)AND SALESORD_HDR.ACCNO = '" & Text.From(DateVariable) &"'"
    in
        SQL_Statement
    

    【讨论】:

      【解决方案2】:

      使用命名范围的简单解决方案

      首先,选择单元格 B7 并在名称框中输入名称(例如 CellReference)。然后右键单击单元格并单击 Get Data from Table/Range


      这将打开 Power Query 编辑器,其中包含一个查询,该查询返回一个包含命名范围中的单元格的表。打开高级编辑器,删除查询的全部内容并输入Text.From(Excel.CurrentWorkbook(){[Name="CellReference"]}[Content][Column1]{0}),然后点击完成,它应该是这样的:

      注意:使用Text.From() 以便CellReference 返回的值可以与使用& 的SQL 查询连接。此外,此功能优于不适用于文本值的Number.ToText()

      最后,在您的 SQL 查询中插入查询名称:WHERE ORDERDATE >= @Month13#(lf)#(tab)and STOCKCODE is not null#(lf)#(tab)AND SALESORD_HDR.ACCNO = "&CellReference

      请注意,如果单元格包含文本值,那么您需要像这样调整语法:... SALESORD_HDR.ACCNO = '"&CellReference_Text&"'"



      如何处理警告:新的查询权限和Formula.Firewall


      如何授予运行所有新的本地数据库查询的权限

      根据您的查询选项设置,每次CellReference 包含新值时,您可能会收到有关运行修改后的 SQL 查询的权限的警告消息:

      如果您确定该单元格永远不会包含a string of characters that could modify the database,您可以通过转到文件-> 选项和设置-> 查询选项来disable this warning message。在 GLOBAL 下,转到 Security 并取消选中 Require user approval for new native database queries

      请注意,这是一个全局设置,会立即应用于所有 Excel 文件,包括当前打开的文件。


      如何禁用 Formula.Firewall 警告消息

      根据您的隐私级别设置,您可能会收到一条Formula.Firewall 警告消息,阻止执行查询:

      如果您处于可以忽略隐私级别的情况,您可以通过转到文件 -> 选项和设置 -> 查询选项来禁用此消息。在当前工作簿下,转到隐私并选择忽略隐私级别并可能提高性能

      单击确定并刷新查询。

      另一方面,如果您的工作簿需要保留 私人组织 的隐私级别,据我所知,目前无法集成 CellReference到 SQL 查询(即使使用 SQL parameter set with the Value.NativeQuery function 或 Power Query Parameter )而不引发此警告消息。唯一的解决方案是在查询的另一个步骤中包含 CellReference,但随后过滤将在 Power Query 中发生,而不是在服务器级别:当步骤包含查询/函数/参数时,query folding 被中断链接到外部数据源,包括工作簿本身中的命名范围。

      如果您的工作簿隐私级别设置为公开,您应该能够通过使用Value.NativeQuery function(如果您使用 SQL Server 或PostgreSQL 数据库)。如果您仍然收到警告消息,您可以尝试将combining the two queries accessing each data source(数据库和工作表)放入单个查询中。



      注意:这些步骤在连接到本地 SQL Server 2019 (15.x) 数据库的 Windows 10 64 位上使用 Excel Microsoft 365(版本 2107)进行了测试。

      这个答案是通过参考 Chris Webb(上面链接)和 Ken Puls (like this one) 的许多博客文章准备的。

      【讨论】:

        猜你喜欢
        • 2021-07-10
        • 1970-01-01
        • 2020-06-23
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 2022-11-26
        相关资源
        最近更新 更多