1 Востаннє редагувалося Romanvolja (19.02.2026 19:15:56)

Тема: Довжина рядка SQL запиту

Підкажіть будь-ласка чи є обмеження у величині рядка SQL запиту?
І чи є можливість його збільшити?
база даних Access 2003 року
SQL запити пишу в Delphi

adoQrMainCoins.SQL.Add('??? ')

2

Re: Довжина рядка SQL запиту

Повинно бути 65536 байт, тобто якщо 2 байти на символ то 32768 символів на запит.

Ось як можна при потребі сплітити запити:

adoQrMainCoins.SQL.Clear;
adoQrMainCoins.SQL.Add('SELECT ID, Name, Description'); 
adoQrMainCoins.SQL.Add('FROM Coins'); 
adoQrMainCoins.SQL.Add('WHERE Value > 1000'); 

Або ж використовувати в'юхи (view).

3 Востаннє редагувалося Romanvolja (19.02.2026 21:24:57)

Re: Довжина рядка SQL запиту

frz написав:

Повинно бути 65536 байт, тобто якщо 2 байти на символ то 32768 символів на запит.

Ось як можна при потребі сплітити запити:

adoQrMainCoins.SQL.Clear;
adoQrMainCoins.SQL.Add('SELECT ID, Name, Description'); 
adoQrMainCoins.SQL.Add('FROM Coins'); 
adoQrMainCoins.SQL.Add('WHERE Value > 1000'); 

Або ж використовувати в'юхи (view).

Дякую за інформацію.

Для вирівнювання тексту запиту я ще натикав пробілів то вони також йдуть як символ??

    'amsMainCoins.IDMainCoins,                    msMainCoinGain.MainCoinGain, '+
    'msMainDateGain.MainDateGain,               msMainCoinSource.MainCoinSource, '+
    'msTypeCompani.TypeCompani,                msMainProviderCoin.MainProviderCoin, '+

може краще переробити таким чином
   

    'amsMainCoins.IDMainCoins, '+                   ' msMainCoinGain.MainCoinGain, '+

4

Re: Довжина рядка SQL запиту

Пробіли це теж символ. Для форматування використовувати пробіли теоретично можна, але корисного навантаження вони не несуть.

Так само невідомо чи запитання про максимальну кількість символів предметне, тобто чи вже досягли максимуму. Якщо так, тоді просто можна розділити запит на декілька рядків, як показано вище. Але такі гігантські запити рідко зустрічаються. Виникає запитання, навіщо. Гігантські запити важко мейнтейнити, варто подумати як спростити.

5 Востаннє редагувалося Torbins (19.02.2026 23:22:06)

Re: Довжина рядка SQL запиту

Перший раз чую, щоб SQL.Add('??? ') мав якісь особливі обмеження на довжину. Стандартне обмеження на довжину рядків в Делфі - 2 Гб. Це обмеження стосується усіх рядків, не лише параметру SQL.Add.
Що стосується обмеження в 65 Кб, то ви напевне плутаєте з VCL компонентами типу Мемо. Мемо є тонкою обгорткою над старими віндовими контролами, і у нього дійсно є обмеження на довжину рядка, яке накладає сама вінда.

Подякували: Romanvolja1

6

Re: Довжина рядка SQL запиту

Я вже в базі даних по скорочував назви таблиць та стовпчиків
Було так:

   'msWorldCoinDenomination.CoinDenomination '+
    'LEFT JOIN msWorldCoinDenomination ON amsWorldCoins.WorldCoinDenomination=msWorldCoinDenomination.ID '+

Скоротив так:

    'msDenomination.Denomination '+
    'LEFT JOIN msDenomination ON amsWorldCoins.Denomination=msDenomination.ID '+

таким чином третину символів відкинув та проблема не зникла, думаю що причина не в кількості символів, а в чомусь другому.

В мене складається враження що кількість ''JOIN'' обмежена.

7

Re: Довжина рядка SQL запиту

Romanvolja написав:

обмеження у величині рядка SQL запиту?

база даних Access 2003

support.microsoft.com написав:

Кількість символів в інструкції SQL : Приблизно 64 000

Максимальне значення може бути менше, якщо запит містить багатозначні поля підстановки (лише ACCDB-файл).

Джерело: Специфікації Access > Специфікації баз даних > Запит

Подякували: Romanvolja1

8

Re: Довжина рядка SQL запиту

Romanvolja написав:

Я вже в базі даних по скорочував назви таблиць та стовпчиків
Було так:

   'msWorldCoinDenomination.CoinDenomination '+
    'LEFT JOIN msWorldCoinDenomination ON amsWorldCoins.WorldCoinDenomination=msWorldCoinDenomination.ID '+

Скоротив так:

    'msDenomination.Denomination '+
    'LEFT JOIN msDenomination ON amsWorldCoins.Denomination=msDenomination.ID '+

таким чином третину символів відкинув та проблема не зникла, думаю що причина не в кількості символів, а в чомусь другому.

В мене складається враження що кількість ''JOIN'' обмежена.

А ця "проблема не зникла" в чому саме? Яка конкретно.помилка?

9

Re: Довжина рядка SQL запиту

leofun01 написав:
Romanvolja написав:

обмеження у величині рядка SQL запиту?

база даних Access 2003

support.microsoft.com написав:

Кількість символів в інструкції SQL : Приблизно 64 000

Максимальне значення може бути менше, якщо запит містить багатозначні поля підстановки (лише ACCDB-файл).

Джерело: Специфікації Access > Специфікації баз даних > Запит

Я скопіював свій SQL запит в Notepad++ там показує кількість символів їх є 5030

10

Re: Довжина рядка SQL запиту

frz написав:
Romanvolja написав:

Я вже в базі даних по скорочував назви таблиць та стовпчиків
Було так:

   'msWorldCoinDenomination.CoinDenomination '+
    'LEFT JOIN msWorldCoinDenomination ON amsWorldCoins.WorldCoinDenomination=msWorldCoinDenomination.ID '+

Скоротив так:

    'msDenomination.Denomination '+
    'LEFT JOIN msDenomination ON amsWorldCoins.Denomination=msDenomination.ID '+

таким чином третину символів відкинув та проблема не зникла, думаю що причина не в кількості символів, а в чомусь другому.

В мене складається враження що кількість ''JOIN'' обмежена.

А ця "проблема не зникла" в чому саме? Яка конкретно.помилка?

Помилку вибиває таку
OLE error 800A0E7F.

Пан leofun01 правий у Access 2003 обмежена кількість зв'язків до 32.
Порадьте чим краще замінити Access 2003

11

Re: Довжина рядка SQL запиту

Romanvolja написав:

проблема не зникла, думаю що причина не в кількості символів, а в чомусь другому.

docwiki.embarcadero.com написав:

Pascal (бажано) :

with ADOQuery1 do begin
    Prepared := True;
    with SQL do begin
        Clear;
        Add('SELECT Name');
        Add('FROM Employee');
    end;
    Open;
end;

Pascal (не бажано) :

ADOQuery1.Close;
ADOQuery1.Prepared := True;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT Name');
ADOQuery1.SQL.Add('FROM Employee');
ADOQuery1.Open;

C++ :

ADOQuery1->Close();
ADOQuery1->Prepared = true;
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT Name");
ADOQuery1->SQL->Add("FROM Employee");
ADOQuery1->Open();

Зверни увагу на Close і Open [або ExecSQL] (вони мають бути).
Якшо запит довгий, то треба Prepared, щоб обджект ADOQuery1 не відправив запит TString передчасно. Там буфер не безмежний.

Джерело:

12

Re: Довжина рядка SQL запиту

Romanvolja написав:

Порадьте чим краще замінити Access 2003

SQLite має зайти без проблем.

docwiki.embarcadero.com (en) :

13 Востаннє редагувалося frz (Вчора 10:51:46)

Re: Довжина рядка SQL запиту

SQLite у порівнянні з MS Access це невеликий крок вперед, хоча звісно величезний стрибок вперед для хом'ячка. Недоліки: 

- один записувач одночасно, single-writer lock
- слабка масштабованість для write-heavy навантажень
- нема серверного процесу, менше контролю з’єднань
- обмежена придатність для багатокористувацьких систем, бо потрібно вигадувати окрему програмну "чергу" операцій десь на клієнтському боці, чи швидше між клієнтською частиною і базою у випадку різних клієнтських додатків
- проблеми при роботі через мережеві файлові системи
- загалом менше сучасних фіч, ніж у PostgreSQL / MySQL.

Тут описав раніше трохи:
https://replace.org.ua/post/191945/#p191945
https://replace.org.ua/post/192223/#p192223
https://replace.org.ua/post/193213/#p193213

Якщо тільки це не embedded, дуже раджу навіть не дивитися в бік SQLite, натомість юзати опенсорсні PostgreSQL / MySQL.

14

Re: Довжина рядка SQL запиту

frz написав:

натомість юзати опенсорсні PostgreSQL / MySQL.

А у PostgreSQL є можливість працювати віддалено чи тільки через сервер?

15

Re: Довжина рядка SQL запиту

Romanvolja написав:
frz написав:

натомість юзати опенсорсні PostgreSQL / MySQL.

А у PostgreSQL є можливість працювати віддалено чи тільки через сервер?

На запитання сформульоване таким чином, важко відповісти, бо незрозуміло, що вкладається в кожне поняття.

Спробую здогадатися.

База даних PostgreSQL - це і є сервер, який не має графічної оболонки. Працює як локально, так і віддалено, якщо налаштовано мережу, відкрито порт.
Для роботи з базою даних можна скачати IDE, їх є багато:
https://wiki.postgresql.org/wiki/PostgreSQL_Clients
Або ж можна звертатися до бази даних програмно і відповідно відображати таблиці, в'юхи, зв'язки між ними (Foreign Key).

MS Access - це умовно кажучи, сервер і графічна оболонка - два в одному. Але з точки зору саме баз даних - це "недо-база", бо має безліч недоліків. Хоча, з іншого боку, дає можливість погратися і дещо зрозуміти, що таке база даних взагалі.

16 Востаннє редагувалося Romanvolja (Вчора 22:01:01)

Re: Довжина рядка SQL запиту

Завантажив версію Windows x86-64 не знаю чи вона встановиться на Windows-7 32bit?

17

Re: Довжина рядка SQL запиту

Romanvolja написав:

Завантажив версію Windows x86-64 не знаю чи вона встановиться на Windows-7 32bit?

Ні. Якщо Windows-7 неможливо оновити до чогось сучаснішого і 64-бітного, то краще відмовитись від PostgreSQL, бо він дуже давно прибрав підтримку 32-біт. З сучасних баз, які ще підтримують 32 біта може бути Firebird.