2

但是我从网上查看了我找不到一个简单的(!)示例,该示例将展示如何使用并拥有一个 SQL 查询,该查询将在 WHERE 中使用动态参数值。

我正在寻找的是最终用户将能够更改电子表格(ParameterTable?)中列中的值并使用这个新值作为参数刷新数据。

也许一个例子最好地描述了我所追求的。

我会在 excel 中有一个表,它有两列,名为 ParameterName 和 ParameterValue。然后这些将具有值 PARM1 和 1(抱歉,我似乎无法在此处发布图像)

查询可能是这样的,所以如果 1=1 检索当前日期(这是 oracle,但对于大多数其他数据库应该是相同的)

从 DUAL 中选择 SYSDATE,其中 1 = 1;

我应该如何更改上面的内容,以便它使用 ParamaterName 和 ParameterValue,即最右边的“1”可以动态更改为任何值。如果该值不是“1”,则不会返回任何结果。

提前致谢

4

4 回答 4

4

我有另一种将参数传递到 Power Query 的方法。我确保它有效。

第一步:在excel中创建一个名为“Infodesk”的表格,也可以随意命名。我的表“Infodesk”包含列“脚本”,我将 SQL 脚本放在此列中。

步骤 2:创建一个空白 Power Query,单击高级编辑器,然后输入以下代码

let
    Source = Sql.Database("192.168.23.81", "dbo.name", [Query= Excel.CurrentWorkbook(){[Name="Infodesk"]}[Content][Script]{0}])

in
    Source

然后,运行您的查询。代码 [Script]{0}] 将从第一行获取数据,您可以在列中放置多个脚本,然后更改 {0} >> {1} 或 {2} ... 以从其他行获取数据。

为了更改 SQL 脚本中的任何参数,您可以使用 excel 函数 =CONCATENATE() 将多个 excel 单元格组合成一个完整的 SQL。

于 2016-03-30T01:38:19.790 回答
2

对于任何可能需要的人:

在任何工作表上创建一个包含您的参数的表格,例如tParam. 分配一个变量:

tParam = Excel.CurrentWorkbook(){[Name="tParam"]}[Content]

如果您使用 AND 逻辑,则将其加入您的数据库表:

tResult = Table.Join(tDatabaseSrc, {"Col1", "Col2"}, tParam, {"ColParameter1", "ColParameter2"}, JoinKind.Inner)

如果您需要对任何比 AND 更复杂的 OR 逻辑,则此技巧将不起作用。然后使用

tResult = Table.SelectRows(tDatabase, each [Col1] = tParam{0}[ColParameter1] or [Col2] = tParam{0}[ColParameter2])

您可以使用更复杂的条件,但您需要先准备一些数据。例如,而不是使用

each [Col1] = tParam{0}[ColParameter1] or [Col1] = tParam{0}[ColParameter2]) [.....] or [Col1] = tParam{0}[ColParameter10])

你可以只用

Table.SelectRows(tDatabaseSrc, each List.Contains(ListOfParameters, [Col1]))

在前面的一些步骤中设置此ListOfParameters变量。

如果您使用本机查询(确实不是最佳实践),那么您可能会丢失查询折叠。另一方面,您可以将每个参数加载到单个变量中:

tParam = Excel.CurrentWorkbook(){[Name="tParam"]}[Content], tParam1 = tParam{0}[ColParameter1], tParam2 = tParam{0}[ColParameter2], etc etc

,然后只需将它们插入到您的查询中。同样,这并不好,因为它会受到 SQL 注入攻击,但会作为一种快速且非永久性的解决方案。

于 2016-08-04T18:18:35.110 回答
1

我建议在这种情况下使用过滤器。您的查询将如下所示:

查询参数值:

let
    // This can be created by using From Table and then drilling into a cell
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content]{0}[ParameterValue]
in
    Source

查询参数名称:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content]{0}[ParameterName]
in
    Source

使用过滤器的查询:

let
    Source = Sql.Database("server", "database"),
    DatabaseTableStepName = Source{[Schema="SchemaName",Item="ItemName"]}[Data],
    Custom1 = Table.SelectRows(DatabaseTableStepName, each Record.Field(_, ParameterName) = ParameterValue)
in
    Custom1

这使用 SQL Server,但对于 Oracle,它应该看起来相似(一些初始导航步骤会有所不同)。

选择要过滤的表后,也可以通过向公式栏添加这样的步骤来创建最后一个查询:

= Table.SelectRows(DatabaseTableStepName, each Record.Field(_, ParameterName) = ParameterValue)

另一种方法是使用本机查询功能,并使用 & 运算符动态构建字符串。我建议尽可能避免使用这种方法,因为每次更改参数时都会提示您,并且如果您动态构建字符串,Power Query 不会为您转义字符串(因此您容易受到 SQL 注入的攻击)。

于 2015-03-30T21:59:41.960 回答
1

使用Native Query 和 &的注释方式对我来说并不清楚,所以我最好留在这里工作示例

let
    Source = Sql.Database("serverName", "dbName", [Query="select CurrencyCode from tCurrList where CurrencyCode = " & Number.ToText( Excel.CurrentWorkbook(){[Name="CCode"]}[Content]{0}[CCode] )])
in
    Source
于 2017-11-28T12:22:47.747 回答