Выполнение длинных запросов через конкатенацию VBA - PullRequest
0 голосов
/ 31 января 2019

Я настраиваю автоматизированную книгу Excel VBA, которая извлекает данные через запрос, получая параметры из ячеек Excel.

До сих пор он работал на простых запросах и SP, но я пытаюсь передать очень длинный запрос, и кажется, что функции Excel обрезают строку до 1043 символов.

* В запросе содержится 1426 символов.

Я использовал 3 разных подхода к этой проблеме.

  1. При выполнении хранимой процедуры SQL (из vba), а не запроса, проблема заключается в том, что одним из входных параметров является список идентификаторов, который имеет переменную длину и очень длинный дляпередать в качестве параметра SP, чтобы он не работал даже при назначении Varchar(Max) в качестве типа.

  2. Выполнение запроса в новой таблице и извлечение полной таблицы в Excel.Несмотря на то, что это работает, необходимо вручную обновить список идентификаторов, поэтому он недостаточно функционален.

  3. Передача строки SQL непосредственно в функцию Excel в виде конкатенации строк, но она выдает ошибку, которая, на мой взгляд, относится к усечению строки.

Мой код выглядит следующим образом:

Private Sub CommandButton1_Click()

Dim organization As Integer  'Business Unit
Dim material As String  'List of IDs

organization = Sheets("Hoja1").Range("B3").Value   'Extract B3
material = Sheets("Hoja1").Range("B4").Value     'Extract B4

'Parsing the query into statements to be concatenated 
Connection
With ActiveWorkbook.Connections("NZSQL Test").ODBCConnection
sql1 = 'statement1 
sql2 = 'statement2
sql3 = 'statement3
sql4 = 'statement4
sql5 = 'statement5
sql6 = 'statement6

Query = sql1 & sql2 & sql3 & sql4 & sql5 & sql6
Sheets("Hoja1").Range("B2") = Query 'This is to beused as revision directly 
in ODBC platform
.CommandText = Query
ActiveWorkbook.Connections("NZSQL Test").Refresh
End With
End Sub

Набор результатов, который я получаю при вставке запроса B2 в SQL:
/* ERROR [42000] ERROR: '...' 'Returns a part of the SQL string */

Строка здесь усекается до1043 символаТем не менее, я попробовал тот же подход из Python с использованием pyodbc, и он работает отлично.

1 Ответ

0 голосов
/ 31 января 2019

Вы пытались явно объявить вашу переменную Query как строку с другими вашими объявлениями в подпрограмме?

Dim Query As String

Согласно здесь , строка может:

  • Строка переменной длины может содержать до 2 миллиардов (2 ^ 31) символов.
  • Строка фиксированной длины может содержать от 1 до 64 К(2 ^ 16) символов.

Надеюсь, это поможет.

...