我决定在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
如果某人至少可以解释错误原因那会很棒!
提前致谢! 米格尔
答案 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注入的风险。