PowerQuery – 在表中使用单元格作为查询中代码的一部分(dynamic或不dynamic)

我想在Excel powerquery中使用单元格作为参数。 查询没有这个工作,但我不得不手动input的值,我需要不断地在其他查询中更改它们以获得我想要的结果。

查询(高级编辑器):

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 

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

原始查询在Sql-Server中完成。 运行查询只有LIKE'%MANUALVALUES%'行时,我没有问题。

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

但是,目前为了testing目的,我试图只使用1-3个值,这个表的前3个(上面查询中的标准{0} {1} {2})。 但是,如果我尝试像Criteria01那样执行类似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(){[Name =“Servers”]} [Content] [ServerSearch] {0}
  2. 如何在查询中引用此值? 由于我写这个查询的方式给我那个错误。

    另外请注意,如果像Criteria01更改TABLERREF.COLUMNHERE CHG1.CI_Name像“Criteria01”我得到以下错误:

     Expression.SyntaxError: Token Comma expected. 
  3. 固定1和2后,如何dynamic地使用它? 例如,而不是索引1 2 3的值,如果我想要使用整个表呢? 我知道,使用Excel.CurrentWorkbook(){[名称=“服务器”]} [内容]将带给我的值的整个表(1列,未知的行数),但我该如何使用此表内容1 1在我的查询?

这将获得值,但是您不能通过将步骤名称放入文本值中来引用步骤。

你有几个dynamic的select。

  1. 使用Value.NativeQuery创build一个参数化查询,您可以在其中传递其他值作为参数。 例如, Value.NativeQuery(Sql.Database("SERVERNAMEHERE", "DATABASENAMEHERE"), "select @a, @b", [a = 1, b = "x"])将返回表[1,x] 。 您可以在logging值中input步骤名称来传递它(例如,将Criteria01replace为“x”)。
  2. 直接在查询字段中添加文本值,例如[Query = "select " & Criteria01 ";"] 。 这是非常沮丧,因为这可能导致SQL注入问题。

对于第三个问题,这取决于你想要对值列表做什么。 在某些情况下,您可能需要使用List.Accumulate将它们全部转换为可以放在查询值中的单个文本值,也可以将它们转换为放入参数值的logging。