Получение метаданных результата TQuery - PullRequest
0 голосов
/ 14 марта 2011

В нашем приложении пользователь может ввести код SQL для извлечения данных из базы данных NexusDB.Мы хотим определить метаданные результата такого запроса, фактически не выполняя запрос.Мы используем метаданные, чтобы определить количество полей и тип данных каждого результирующего поля.

[дополнение] Мы используем эту функцию как часть пользовательского процесса преобразования.Фактическое преобразование выполняется позже в процессе, подобном пакетному, но нам нужны метаданные заранее, чтобы пользователь мог указать при преобразовании дополнительные характеристики или модификации поля, такие как применение плагинов, создание родительско-дочерних отношений и т. Д. [/ Дополнение]

До сих пор мы делали это, просто добавляя WHERE FALSE к запросу SQL или заменяя все уже существующие операторы WHERE на WHERE FALSE AND.Но, конечно, мы должны проанализировать весь SQL, чтобы определить точное местоположение правильного предложения where для корректировки, принимая во внимание комментарии, вложенные SELECTS, JOINs и другие предложения.Это становится довольно сложно :-(

И еще один недостаток в том, что большую часть времени выполнение запроса может все еще занимать много времени, хотя мы заранее знаем, что набор результатов будет пустым.

Нам было интересно, есть ли другой способ достижения этого.

т.е. объект TQuery должен иметь собственный синтаксический анализатор, разделяющий оператор SQL на его различные предложения. Если бы мы могли изменитьпредложение where непосредственно перед выполнением, нам не нужно было бы выполнять синтаксический анализ самим, но мы немного беспокоимся о том, чтобы погрузиться во внутренности объекта TQuery, просто чтобы узнать, что нет способа использовать его так, как мы хотим.

Кто-нибудь может посоветовать это?

Ответы [ 3 ]

3 голосов
/ 14 марта 2011

Вариант того, что вы уже делаете, - поместить исходную SQL-статистику во вложенный выбор вместо изменения предложения where. Если select * from MyTable - ваш сложный запрос, вы можете встроить его таким образом, чтобы не получить результата.

select *
from
(
  select *
  from MyTable
) as xx
where 0=1

Я проверял это только в SQL Server, а не в NexusDB

1 голос
/ 14 марта 2011

Погружение в клиентский компонент TnxQuery не поможет.Это всего лишь обертка вокруг оператора и дескриптора курсора.Единственный способ получить метаданные, которые вы ищите на стороне клиента, - из дескриптора курсора.Дескриптор курсора создается только при выполнении запроса.

На данный момент единственным способом минимизировать работу, выполняемую при выполнении запроса, является то, что вы уже делаете.

ЕслиВы отправляете запрос функции в нашем трекере ошибок (http://www.nexusdb.com/mantis/view_all_bug_page.php), и мы можем исследовать возможность указания какого-либо флага, чтобы механизм подскажет «никогда не обрабатывать данные» без необходимости возиться с самим запросом.

0 голосов
/ 14 марта 2011

Вы также можете попытаться связать TClientDataset с TDatasetProvider с исходным TQuery (или любым потомком TDataset). Затем установите для свойства PacketRecords элемента TClientDataset значение 0 и откройте его. Он извлечет поля в TClientDataSet без каких-либо данных.

...