在Excel电源查询中替换SQL查询参数

时间:2018-04-04 16:46:56

标签: excel excel-vba powerquery excel-2016 vba

我有一个工作簿,我可以使用SQL查询的固定参数值从SQL Server获取数据。现在我想要的是制作另一张表,并从单元格值中获取SQL查询的参数。我显然已经搜索过,但在这方面没有找到任何建议。另外,我想在单元格值在另一个工作表中更改时刷新数据。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

为此,您需要设置三个不同的部分:

1)Excel工作表中的参数表

2)对PowerQuery中高级编辑器的更改

3)当参数表中的任何单元格被更改时刷新PQ的宏

1)Excel表格

您可以看到我添加了一个名为param的列,其中可以保存参数名称,以帮助确定哪个参数是哪个。

Sample Param Table

2)PQ高级编辑

let
    ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Param = "'" & Text.From(ParamTable[value]{0}) & "'",
    Source = Sql.Database("IP Address", "Database Name", [Query="Select * from weeks#(lf)where date >= '2018-01-01' and date < " &Param])
in
    Source

等效替代方法:(SQL查询中使用的变量位置的差异。)

let
    ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Param = "'" & Text.From(ParamTable[value]{0}) & "'",
    Source = Sql.Database("IP Address", "Database Name", [Query="Select * from weeks#(lf)where date < " &Param & " and date >= '2018-01-01'"])
in
    Source

备选变量类型:(如果处理数字,则不需要字符串标记'

let
    ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    Param = Text.From(ParamTable[value]{0}),
    Source = Sql.Database("IP Address", "Database Name", [Query="Select * from weeks#(lf)where cnt < " &Param & " and date >= '2018-01-01'"])
in
    Source

<强>解释

将参数表拉入PQ查询(ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content])后,可以按列名[value]访问列,使用零索引号{0}访问行。因为我提到了一个日期值。我需要将它转换为我可以插入SQL查询的字符串值 - 因此Text.From()和附加'到最后( SQL标记单个字符串&#39;而不是双&#34;

由于我将变量命名为Param,要在字符串中使用它,我将&Param替换为最初存在的值。

3)宏

这适用于简单检查表中是否有任何更改,然后运行刷新。您需要确保将其放在正确的模块中。您需要更改的项目是:

  • Sheet1是带有参数表的工作表的代号。
  • "Table"是参数表的名称
  • "Query - Query1"是要刷新的连接的名称

注意: Query1是查询的名称。连接的默认名称通常为Query -&amp;查询名称

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Sheet1.ListObjects("Table1").DataBodyRange) Is Nothing Then
        ThisWorkbook.Connections("Query - Query1").Refresh
    End If
End Sub