Expression.Error при динамической передаче запроса SQL Teradata (с псевдонимами столбцов) в запрос ODBC - PullRequest
0 голосов
/ 07 мая 2019

У меня есть макрос, который запрашивает у меня запрос SQL (если он не был вызван другим Sub, в этом случае он использует аргумент, который был передан в качестве необязательного строкового параметра в качестве запроса), а затем выполняет запрос к моим Teradata База данных SQL.

Работает нормально, , если в нет псевдонима столбца с пробелом в запросе.

Пример запроса: 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"

Я предполагаю, что это связано с тем фактом, что в приведенном выше примере запроса есть двойные кавычки для псевдонима, которые путают синтаксис при попытке его интерполировать. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 07 мая 2019

Вот что в этой строке установлено для строки 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.НО, потому что вы должны пережить еще один раунд eval в powerquery, вам нужно бежать еще раз.Вместо этого:

 code="SELECT 2 + 2 AS """"Query Result"""";"

* Я думаю ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...