【问题标题】:Excel 2013 power query - SQL query with a dynamic parameterExcel 2013 power query - 带有动态参数的 SQL 查询
【发布时间】:2015-06-02 01:29:11
【问题描述】:

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

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

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

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

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

从 DUAL WHERE 1 = 1 中选择 SYSDATE;

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

提前致谢

【问题讨论】:

    标签: sql dynamic parameters where powerquery


    【解决方案1】:

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

    第一步:在excel中创建一个名为“Infodesk”的表格,也可以随意命名。我的表“Infodesk”包含列“Script”,我将 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。

    【讨论】:

    • 谢谢!!这在 Excel Office 365 中对我有用,唯一的修改是从 OPs 查询的末尾删除分号。至关重要的是,打开“Power Query 编辑器”窗口后,单击“主页”,然后单击“高级编辑器”——这将打开一个窗口,其中应粘贴“让 ... in Source”代码。因此,在我的情况下,这是“脚本”列中第一行的值:SELECT SYSDATE FROM DUAL WHERE 1 = 1 另请注意:如果您修改 excel 表 table_names、column_name、它的位置 sheet_name 等 Power Query Code不会自动更新。
    【解决方案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 注入攻击,但会作为一种快速且非永久性的解决方案。

    【讨论】:

      【解决方案3】:

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

      查询参数值:

      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 注入的攻击)。

      【讨论】:

        【解决方案4】:

        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
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-29
        • 1970-01-01
        • 2017-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多