我想使用 Excel 单元格来更改Where
语句中的参考数据,这样我就不必继续进行电源查询来更改语句。
而不是31690
下面的代码,我想cell B7
在sheet1
同一个工作簿中引用。
这可能吗?如果是这样怎么办?提前致谢。
WHERE ORDERDATE >= @Month13#(lf)#(tab)and STOCKCODE is not null#(lf)#(tab)AND SALESORD_HDR.ACCNO = '31690'
我想使用 Excel 单元格来更改Where
语句中的参考数据,这样我就不必继续进行电源查询来更改语句。
而不是31690
下面的代码,我想cell B7
在sheet1
同一个工作簿中引用。
这可能吗?如果是这样怎么办?提前致谢。
WHERE ORDERDATE >= @Month13#(lf)#(tab)and STOCKCODE is not null#(lf)#(tab)AND SALESORD_HDR.ACCNO = '31690'
也许是这样的?
要使这种方法起作用,您需要确保您的电子表格有一个表格,并且表格的范围从 A1 开始,并跨越包含其中值的单元格 - 在本例中为 B7。这是一个例子:
我首先使用名为 Table1 的表创建此电子表格:
然后,我使用 Table1 作为 Power Query 中的源。
请注意,在上表中,第 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
首先,选择单元格 B7 并在名称框中输入名称(例如CellReference
)。然后右键单击单元格并单击Get Data from Table/Range。
这将打开带有查询的 Power Query 编辑器,该查询返回包含命名范围中的单元格的表。打开高级编辑器,删除查询的全部内容并键入Text.From(Excel.CurrentWorkbook(){[Name="CellReference"]}[Content][Column1]{0})
并单击完成,它应该是这样的:
注意:Text.From()
用于使返回的值CellReference
可以与使用&
. 此外,此功能优于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&"'"
如何授予运行所有新的本机数据库查询的权限
根据您的查询选项设置,您可能会收到有关每次运行修改后的 SQL 查询的权限CellReference
包含一个新值的警告消息:
如果您确定单元格永远不会包含可能修改数据库的字符串,您可以通过转到文件 -> 选项和设置 -> 查询选项来禁用此警告消息。在 GLOBAL 下,转到Security并取消选中Require user approval for new native database queries。
请注意,这是一个全局设置,会立即应用于所有 Excel 文件,包括当前打开的文件。
如何禁用 Formula.Firewall 警告消息
根据您的隐私级别设置,您可能会收到一条Formula.Firewall
警告消息,阻止执行查询:
如果您处于可以忽略隐私级别的情况,您可以通过转到文件 -> 选项和设置 -> 查询选项来禁用此消息。在当前工作簿下,转到隐私并选择忽略隐私级别并可能提高性能。
单击确定并刷新查询。
另一方面,如果您的工作簿需要保留Private或Organizational的隐私级别,据我所知,目前无法集成CellReference
到 SQL 查询(即使使用带有 Value.NativeQuery 函数或 Power的 SQL 参数集)查询参数)而不引发此警告消息。唯一的解决方案是CellReference
在查询中包含另一个步骤,但随后过滤将在 Power Query 中发生,而不是在服务器级别:当步骤包含链接到外部的查询/函数/参数时,查询折叠会中断数据源,包括工作簿本身中的命名范围。
如果您的工作簿隐私级别设置为Public,您应该能够通过使用Value.NativeQuery 函数来避免此警告消息(如果您使用 SQL Server 或 PostgreSQL 数据库,您甚至可以启用查询折叠以进行进一步的查询步骤)。如果您仍然收到警告消息,您可以尝试将访问每个数据源(数据库和工作表)的两个查询组合成一个查询。
注意:这些步骤在连接到本地 SQL Server 2019 (15.x) 数据库的 Windows 10 64 位上使用 Excel Microsoft 365(版本 2107)进行了测试。
这个答案是通过参考 Chris Webb(上面链接)和 Ken Puls(比如这个)的许多博客文章准备的。