Power Query - 如何通过名称而不是索引值获取 Record.Field 值?

Power Query - How to get Record.Field value by name instead of index value?

我是 Power Query 的新手,阅读了足够多的资料以获得参数化查询和 运行。

在 Excel 中,在名为“参数”的选项卡上,我有一个名为“myParams”的范围,它跨越 A1:B4。它由 2 列组成,其中 A1 =“参数名称”和 B1 =“值”

    A                 B
1   Parameter Name    Value
2   User ID           12345
3   Other Thing       foo
4   More Things       bar

我的查询看起来像这样,工作正常:

let
    myParamTable = Excel.CurrentWorkbook(){[Name="myParams"]}[Content],
    pUserID = Record.Field(myParamTable{0}, "Value"),

    Source = Sql.Database("myservername", "mydatabase"),

    GoQuery = Value.NativeQuery(Source,
    "
    SELECT * FROM myTable WHERE UserIdField = @UserID",
    [UserID = pUserID]
    )
in
    GoQuery

如果我理解这是如何工作的,pUserID 会在名为“Value”的列中的位置 0 中分配值,因为索引从 0 开始计数。

如何通过 A 列中的名称“用户 ID”获取值?我想它接近于

pUserID = Record.Field(myParamTable{"User ID"}, "Value"),

我想使用参数名称而不是索引值,因为如果将新字段添加到“myParams”范围,索引值将来可能会发生变化。

谢谢!

方法有很多种。这是一个使用 Lists

let
    myParamTable = Excel.CurrentWorkbook(){[Name="myParams"]}[Content],
    fieldList = myParamTable[#"Parameter Name"],
    valueList = myParamTable[Value],
    pUserID = valueList{List.PositionOf(fieldList,"User ID")}  
in
    pUserID

您可以像这样通过参数名称而不是索引号来引用行。

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"User ID" = Source{[#"Parameter Name"="User ID"]}[Value]
in
    #"User ID"

Chris Webb 的博客对这类事情有很好的 post here