PowerQuery - 使用表中的单元格作为查询中代码的一部分(动态或不动态)

时间:2017-05-10 17:15:22

标签: sql excel powerquery

我正在尝试使用单元格作为Excel powerquery中的参数。查询在没有这个的情况下工作,但我必须手动输入值,我需要在查询中不断更改它们以获得我想要的结果。

查询(高级编辑):

let
    Criteria01 = Excel.CurrentWorkbook(){[Name="Servers"]}[Content][ServerSearch]{0},
    Criteria02 = Excel.CurrentWorkbook(){[Name="Servers"]}[Content][ServerSearch]{1},
    Criteria03 = Excel.CurrentWorkbook(){[Name="Servers"]}[Content][ServerSearch]{2},
    Source = Sql.Database("SERVERNAMEHERE", "DATABASENAMEHERE", [Query="SELECT DISTINCT [...........] AND (TABLEPREF.COLUMNHERE like '%MANUALVALUE01%' OR#(lf)TABLEPREF.COLUMNHERE like '%MANUALVALUE02%' OR#(lf)TABLEPREF.COLUMNHERE like '%MANUALVALUE03%' OR#(lf)TABLEPREF.COLUMNHERE like Criteria01)#(lf)#(lf)#(lf)order by 1 asc"])
in
    Source

“Servers”是表名,“ServerSearch”是列标题。如果我检查Criteria01 / etc的步骤,它将显示我需要使用的该表的正确值。

在Sql-Server中完成的原始查询。使用 LIKE'%MANUALVALUES%'行运行查询时没有问题。

我的主要目标是从表格中的表格中自动获取“MANUALVALUES”的N值,这将用作比较的输入 WHERE TABLEPREF.COLUMNHERE,如'%VALUEHERE %'。我必须使用这个,我无法获得整个表/数据库,因为除了我想要的结果之外,还有太多的结果。

然而,出于测试目的,我尝试仅使用1-3个值,即此表的前3个(上面的查询中的条件{0} {1} {2})。但是,如果我尝试执行像 01 这样的 TABLEPREF.COLUMNHERE,我会收到以下错误:

DataSource.Error: Microsoft SQL: Invalid column name 'Criteria01'.
Details:
    DataSourceKind=SQL
    DataSourcePath=dalsql390;itdw
    Message=Invalid column name 'Criteria01'.
    Number=207
    Class=16

所以我的问题是:

  1. 我正确地获取表格单元格值?含义: Excel.CurrentWorkbook(){[名称= “服务器”]} [内容] [ServerSearch] {0}
  2. 如何在查询中引用此值?自从我写的方式     那个问题给我带来了那个错误。

    另请注意,如果更改 TABLEPREF.COLUMNHERE之类的话 Criteria01 CHG1.CI_Name就像“Criteria01”我得到了 以下错误:

    Expression.SyntaxError: Token Comma expected.
    
  3. 固定1和2之后,我该如何动态使用它?对于 例如,如果我想要的话,而不是获得索引1 2 3的值 用整张桌子?我知道用的 Excel.CurrentWorkbook(){[Name =“Servers”]} [Content] 将为我带来整个值表(1列,未知行数),但是 如何在我的查询中逐个使用此表格内容?

1 个答案:

答案 0 :(得分:1)

这将获得该值,但您不能通过在其中放置步骤名称来引用文本值内的步骤。

您可以选择动态执行此操作。

  1. 使用Value.NativeQuery创建参数化查询,您可以在其中传入其他值作为参数。例如,Value.NativeQuery(Sql.Database("SERVERNAMEHERE", "DATABASENAMEHERE"), "select @a, @b", [a = 1, b = "x"])将返回表[1,x]。您可以在记录值中输入步骤名称来传递它(例如,将" x"替换为Criteria01)。
  2. 直接在查询字段中添加文本值,例如[Query = "select " & Criteria01 ";"]。这是非常不鼓励的,因为这可能导致SQL注入问题。
  3. 对于第三个问题,它取决于您想要对值列表执行的操作。在某些时候,您可能需要List.Accumulate将它们全部转换为单个文本值,该值可以放在查询值中,也可以将它们转换为记录以放入参数值。