在 Excel 幂查询中替换 SQL 查询参数
Replace SQL query parameter in a Excel power query
我有一个工作簿,我在其中使用 SQL 查询的固定参数值从 SQL 服务器获取数据。
我想创建另一个 sheet 并从单元格值中获取 SQL 查询的参数。
我没有找到这方面的任何东西。
我还想在另一个 sheet 中的单元格值发生变化时立即刷新数据。
为此,您需要设置三个不同的部分:
1) Excel sheet
中的参数 table
2) PowerQuery 中高级编辑器的更改
3) 当参数 table 中的任何单元格更改时刷新 PQ 的宏
1) Excel Table
你可以看到我包含了一个名为 param
的列,其中 可以 保存参数名称以帮助明确哪个参数是哪个。
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
解释:
将参数 Table 拉入 PQ 查询 (ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content]
) 后,可以通过列名 [value]
访问列,通过 zero-index 数字访问行{0}
。因为我拉了 date-value。我需要将它转换为可以插入到 SQL 查询中的字符串值——因此 Text.From()
和附加的 '
's to the ends (SQL marks strings with single ' 而不是双“)
由于我将变量命名为 Param
,为了在字符串中使用它,我用 &Param
替换了原来存在的值。
2.1 Power Query 的 Value.NativeQuery
let
ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Param = ParamTable[value]{0},
Source = Value.NativeQuery(Sql.Database("IP Address", "Database Name"), "Select * from weeks where date < @dateSel and date >= '2018-01-01'",[dateSel = Param])
in
Source
替代格式:
let
ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Param = ParamTable[value]{0},
Source = Sql.Database("IP Address", "Database Name"),
Data = Value.NativeQuery(Source, "
Select * from weeks
where date < @dateSel and date >= '2018-01-01'
",[dateSel = Param])
in
Source
备注:
使用 Value.NativeQuery()
时,您可以直接将日期或日期时间值作为变量传递,而无需包含单个撇号。
有时将数据检索拆分为 Source
步骤和 NativeQuery
步骤可以帮助解决 PQ 的零星防火墙问题。
3) 宏
这适用于简单检查 table 中是否有任何更改,然后运行刷新。您需要确保将其放置在正确的模块中。您需要更改的项目是:
Sheet1
为作品代号sheet带参数table.
"Table"
是参数的名称table
"Query - Query1"
是要刷新的连接名
注: Query1
为查询名称。连接的默认名称通常是 Query -
& query name
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
我有一个工作簿,我在其中使用 SQL 查询的固定参数值从 SQL 服务器获取数据。
我想创建另一个 sheet 并从单元格值中获取 SQL 查询的参数。
我没有找到这方面的任何东西。
我还想在另一个 sheet 中的单元格值发生变化时立即刷新数据。
为此,您需要设置三个不同的部分:
1) Excel sheet
中的参数 table2) PowerQuery 中高级编辑器的更改
3) 当参数 table 中的任何单元格更改时刷新 PQ 的宏
1) Excel Table
你可以看到我包含了一个名为 param
的列,其中 可以 保存参数名称以帮助明确哪个参数是哪个。
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
解释:
将参数 Table 拉入 PQ 查询 (ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content]
) 后,可以通过列名 [value]
访问列,通过 zero-index 数字访问行{0}
。因为我拉了 date-value。我需要将它转换为可以插入到 SQL 查询中的字符串值——因此 Text.From()
和附加的 '
's to the ends (SQL marks strings with single ' 而不是双“)
由于我将变量命名为 Param
,为了在字符串中使用它,我用 &Param
替换了原来存在的值。
2.1 Power Query 的 Value.NativeQuery
let
ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Param = ParamTable[value]{0},
Source = Value.NativeQuery(Sql.Database("IP Address", "Database Name"), "Select * from weeks where date < @dateSel and date >= '2018-01-01'",[dateSel = Param])
in
Source
替代格式:
let
ParamTable = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
Param = ParamTable[value]{0},
Source = Sql.Database("IP Address", "Database Name"),
Data = Value.NativeQuery(Source, "
Select * from weeks
where date < @dateSel and date >= '2018-01-01'
",[dateSel = Param])
in
Source
备注:
使用 Value.NativeQuery()
时,您可以直接将日期或日期时间值作为变量传递,而无需包含单个撇号。
有时将数据检索拆分为 Source
步骤和 NativeQuery
步骤可以帮助解决 PQ 的零星防火墙问题。
3) 宏
这适用于简单检查 table 中是否有任何更改,然后运行刷新。您需要确保将其放置在正确的模块中。您需要更改的项目是:
Sheet1
为作品代号sheet带参数table."Table"
是参数的名称table"Query - Query1"
是要刷新的连接名
注: Query1
为查询名称。连接的默认名称通常是 Query -
& query name
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