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



我决定在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"

我们的想法只是读取表43中的值,将其转换为文本并将其存储在#"Current_EXE_ID"变量中,以便我可以从另一个工作表中检索它。

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

[表达式。[错误]导入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查询

让来源= Oracle。Database(", [Query="SELECT * #(lf)FROM TABLE_NAME#(lf)WHERE EXE_ID =" &fnGetExeId("EXE_ID")])在源

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

表达式。错误:我们不能应用运算符&输入文本和数字。细节:运算符=,Left=SELECT * #(lf)FROM TABLE_NAME#(lf)WHERE EXE_ID =正确的= 43

如果有人能解释一下错误的原因,那就太好了!

提前感谢!米格尔

1)第一个表达式。错误看起来像是打字错误。是否有任何地方的查询被引用为#"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注入的风险。

最新更新