Power Query - 如何在Oracle SQL查询中使用Excel 2016单元格值

时间:2016-10-24 13:05:14

标签: oracle powerquery

我决定在Excel 2016中使用Power Query来加载和解释我从Oracle DB中检索的一些数据。我想根据特定的执行代码EXE_ID加载几张表,根据我打算看到的数据,这些代码可能会有所不同。

我想做的事情应该比较直接,至少根据我到目前为止看到的所有教程:我只想在一张表中指定EXE_ID并希望每张表中的所有查询都是能够读取它并相应地加载信息。问题是我总是遇到某种错误。

这是我最近的尝试:

我创建了一个简单的表,其中包含一个名为Current_EXE_ID的标题和一个名为43的单个值。

之后我创建了一个空白查询,其中添加了以下代码:

let
  Source = Excel.CurrentWorkbook(){[Name="GetExeId"]}[Content],
  #"Changed Type" = Table.TransformColumnTypes(Source,{{"Current_EXE_ID", type text}}),
  #"Current_EXE_ID" = #"Changed Type"{0}[Current_EXE_ID]
in
  #"Current_EXE_ID"

ideia只是读取表中的值,43,将其转换为文本并将其存储在#“Current_EXE_ID”变量中,以便我可以从不同的表中检索它。

当我尝试在不同工作表中的查询中包含变量并尝试访问它时,我收到以下错误消息:

  

[Expression.Error]导入CUrrent_EXE_ID不匹配导出。难道   你错过了模块参考?

以下是我的表现:

let
    Source = Oracle.Database("<DB_NAME>", [Query="SELECT * #(lf)FROM TABLE_NAME#(lf)WHERE EXE_ID = " & #"Current_EXE_ID"])
in
    Source

我也尝试了不同的方法,例如通过空白查询页面创建一个带有以下代码的参数表:

(ParameterName as text) =>
let
ParamSource = Excel.CurrentWorkbook(){[Name="Parameters"]}[Content],
ParamRow = Table.SelectRows(ParamSource, each ([Parameter] = ParameterName)),
Value=
if Table.IsEmpty(ParamRow)=true
then null
else Record.Field(ParamRow{0},"Value")
in
Value

我将函数fnGetExeId命名为Oracle SQL查询

让     Source = Oracle.Database(“”,[Query =“SELECT *#(lf)FROM TABLE_NAME#(lf)WHERE EXE_ID =”&amp; fnGetExeId(“EXE_ID”) ]) 在     源

但我最终得到了这个错误:

  

Expression.Error:我们无法应用运算符&amp;键入文本和数字。   细节:       操作者=安培;       Left = SELECT *#(lf)FROM TABLE_NAME#(lf)WHERE EXE_ID =       右= 43

如果某人至少可以解释错误原因那会很棒!

提前致谢! 米格尔

1 个答案:

答案 0 :(得分:0)

1)第一个Expression.Error看起来像一个错字。是否有任何地方将查询引用为#"CUrrent_EXE_ID"而不是#"Current_EXE_ID"

2)看起来Record.Field(ParamRow{0},"Value")在您发布的函数中返回一个数字。如果您计划仅使用它来构建SQL查询,则可以将其更改为Number.ToText(Record.Field(ParamRow{0},"Value")),然后它应该可以正常工作。

但是,如果您只需要执行一个简单的WHERE语句,您也可以使用Table.SelectRows,如下所示:

Table.SelectRows(Source, each [EXE_ID] = Current_EXE_ID)

这是首选解决方案,因为它允许Power Query将进一步的转换折叠到它发送给服务器的查询中,并消除了SQL注入的风险。