Expression.Error 将 Teradata SQL 查询(使用列别名)动态传递到 ODBC 查询时
Expression.Error when dynamically passing in Teradata SQL query (with column aliases) to ODBC query
我有一个宏提示我进行 SQL 查询(除非它被另一个 Sub 调用,在这种情况下它使用传递到其可选字符串参数的参数作为查询)然后对我的 Teradata SQL 数据库执行查询。
它工作正常,除非查询中有一个包含 space 的列别名。
示例查询:
SELECT 2 + 2 AS "Query Result";
错误:
Run-time error '1004':
[Expression.Error] The name 'Source' wasn't recognized. Make sure it's spelled correctly.
我认为是罪魁祸首的代码行如下(对于可读性,我深表歉意——我记录了宏,对其进行了修改,使其能够稍微动态地工作,之后就再也没有碰过它).
ActiveWorkbook.Queries.Add Name:=queryName, formula:= _
"let" & Chr(13) & "" & Chr(10) & " Source = Odbc.Query(""dsn=my-server-name"", " & Chr(34) & code & Chr(34) & ")" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " Source"
我认为这与上面的示例查询的别名有双引号这一事实有关,这在尝试插入时混淆了语法。任何帮助将不胜感激!
formula
的字符串在此行中设置为:
ActiveWorkbook.Queries.Add Name:=queryName, formula:=<string here>
完成所有 chr()
和连接后:
let
Source = Odbc.Query("dsn=my-server-name", "<code>")
in
Source
该标记 <code>
将替换为您的变量 code
中的任何内容。所以我怀疑你是对的,因为这个公式需要完全转义双引号。
换句话说,您正在构建的字符串 Formula
将作为代码本身进行评估,即使在该评估中,它也会将更多代码(您的 SQL)传递到 Teradata服务器在那里进行评估。
您正在启动代码。 VBA 代码编写 powerquery 代码编写 Teradata 代码。
了解这一点并在此处进行一些猜测,我认为您当前的 code
变量类似于:
code="SELECT 2 + 2 AS ""Query Result"";"
您的双引号已经转义 VBA。但是因为你必须在 powerquery 的另一轮评估中幸存下来,所以你需要再次逃脱。相反:
code="SELECT 2 + 2 AS """"Query Result"""";"
*我觉得...
我有一个宏提示我进行 SQL 查询(除非它被另一个 Sub 调用,在这种情况下它使用传递到其可选字符串参数的参数作为查询)然后对我的 Teradata SQL 数据库执行查询。
它工作正常,除非查询中有一个包含 space 的列别名。
示例查询:
SELECT 2 + 2 AS "Query Result";
错误:
Run-time error '1004':
[Expression.Error] The name 'Source' wasn't recognized. Make sure it's spelled correctly.
我认为是罪魁祸首的代码行如下(对于可读性,我深表歉意——我记录了宏,对其进行了修改,使其能够稍微动态地工作,之后就再也没有碰过它).
ActiveWorkbook.Queries.Add Name:=queryName, formula:= _
"let" & Chr(13) & "" & Chr(10) & " Source = Odbc.Query(""dsn=my-server-name"", " & Chr(34) & code & Chr(34) & ")" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & " Source"
我认为这与上面的示例查询的别名有双引号这一事实有关,这在尝试插入时混淆了语法。任何帮助将不胜感激!
formula
的字符串在此行中设置为:
ActiveWorkbook.Queries.Add Name:=queryName, formula:=<string here>
完成所有 chr()
和连接后:
let
Source = Odbc.Query("dsn=my-server-name", "<code>")
in
Source
该标记 <code>
将替换为您的变量 code
中的任何内容。所以我怀疑你是对的,因为这个公式需要完全转义双引号。
换句话说,您正在构建的字符串 Formula
将作为代码本身进行评估,即使在该评估中,它也会将更多代码(您的 SQL)传递到 Teradata服务器在那里进行评估。
您正在启动代码。 VBA 代码编写 powerquery 代码编写 Teradata 代码。
了解这一点并在此处进行一些猜测,我认为您当前的 code
变量类似于:
code="SELECT 2 + 2 AS ""Query Result"";"
您的双引号已经转义 VBA。但是因为你必须在 powerquery 的另一轮评估中幸存下来,所以你需要再次逃脱。相反:
code="SELECT 2 + 2 AS """"Query Result"""";"
*我觉得...