Страницы: 1
RSS
Динамический SQL запрос/ максимальная длина строки
 
Добрый день.
Может кто сталкивался с подобной задачей.
Необходимо создать запрос для "сборки" таблицы медотом SQL запроса, в зависимости от входного кол-ва элементов, т.е.
Имею входной массив с названиями файлов и следующий код для формирования текста запроса:
Код
For i = 0 To UBound(MyArray)
    MyArray(i) = Dir_1 & MyArray(i) & ".xlsx" & "`.`Лист1$`"
    If i > 0 Then
        Command = Command & " UNION SELECT * FROM " & MyArray(i)
    Else
        Command = "SELECT * FROM " & MyArray(i)
    End If
Next

With Worksheets(T).ListObjects.Add(SourceType:=0, Source:=Array(Array( _
        "ODBC;DSN=Excel Files;DBQ=" & DefDir & ";DefaultDir=" & Dir & ";DriverId=1046;MaxBufferSize=2048;PageTimeout=5;")), _
        Destination:=Range("$A$1")).QueryTable
        .CommandText = Array(Command)
        .ListObject.DisplayName = "Таблица"
        .Refresh BackgroundQuery:=False
    End With
И проблема в длине строки. Когда элементов 2-3 - все нормально, но когда их больше, то переменная "Command" приобретает величину больше 255 символов, по типу:

Command = "SELECT * FROM 'C:\Windows\123\456\789\FileName1.xls.Лист1$ UNION SELECT * FROM 'C:\Windows\123\456\789\FileName2.xls.Лист1$ UNION SELECT * FROM 'C:\Windows\123\456\789\FileName3.xls.Лист1$"...........

Тогда и вылетает ошибка.
Подскажите, возможно есть другой способ построения данных запросов или строковые переменные иных "космических размеров")?
Заранее спасибо.

 
Раздел платных заказов. Правильно разместили тему?
 
Проблема будет в другом: MSQuery, который выполняет этот запрос, не сможет объединить более 50 UNION. Переходите на PowerQuery.
На работу не претендую.
Неизлечимых болезней нет, есть неизлечимые люди.
 
:) Платный заказ - это конечно хорошо, но думаю разберусь своими силами, времени больше уйдет.

На PQ - сейчас все и крутится, безспорно очень удобно, но:
а) время для обработки много требуется;
б) в перспективе будем уходить от Эксель, интересен скуль, возможно не через Qwery запросы.

В любом случае - спасибо.
 
Тема перенесена в раздел вопросов.
 
Измените строку 13 на:
Код
.CommandText = Command

Потолок длины Command станет 32767 (вместо 255).
Изменено: sokol92 - 25.10.2019 18:15:50
Владимир
 
Цитата
sokol92 написал:
.CommandText = Array(Command)
Огромное человеческое спасибо!
 
Успехов!
Владимир
Страницы: 1
Наверх