![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос без раздела WHERE [D5, D7]
stelius © (2005-06-09 15:15:00)Народ, подскажите где можно посмотреть алгоритм какого-нить SQL парсера.
Проблема следующая: на вход подаеться текст скуль запроса а на выходе должен быть этот запрос, но без разделов WHERE, ORDER BY, HAVING и пр. (проще говоря только разделы SELECT и FROM, остально отсечь)
Anatoly Podgoretsky (2005-06-10 07:52:00) [21]stelius © (09.06.05 17:18) [15]
Про то и речь, что анализ это не просто, а просто не возможен. Надо поступать как сказали - пустой запрос и коллекция полей у тебя на клиенте, вот его тоже не просто будет получить.
TQuery поступает просто - получает набор как есть, ничего не анализируя и не изменяя.
ЮЮ (2005-06-10 02:40:00) [22]А не проще все-таки выполнить запрос, который чел написал именно с этой целью, а затем уж смотреть поля. Надеюсь твои манипуляции с полученным НД будут не "тяжелее", чем выполнение запроса.
stelius (2005-06-09 17:36:00) [23]Я б с удовольствием его выполнил, ток шоб он, панимаешь, данные не возвращал. Мне ж токма список полей нужен...
Только вот какая фишка: с подзапросами все нормуль, када оракла, а вот акцец, лениться сие делать. Конечно можно просто добавить в раздел WHERE строку " and (1=0)", но здесь задача сводиться к вычленению из общего текста запроса этого самого раздела WHERE, этт собсно сабж.
Все таки подскажите что-нить на счет stelius © (09.06.05 16:41) [6].
Или где посмотреть код процедуры, которую выпольняет компонент TQuery когда указываешь "Add all fields" - он же решает подобную задачу.
MOA (2005-06-09 17:22:00) [24]А, чёрт! показалось, что речь про MSSQL. Прошу прощения - померещилось ;).
Johnmen (2005-06-09 17:21:00) [25]>MOA © (09.06.05 17:18) [14]
Это так в Оракле ? Или в Аксессе ?
>stelius © (09.06.05 17:18) [15]
"Выполни запрос, Ксанф" ( почти по Эзопу :) )
stelius (2005-06-09 17:18:00) [26]2Anatoly Podgoretsky © (09.06.05 17:06) [11]
да этт понятно... я ж это просто как один из примерог указал.
тут же куча вариантог:
select t1.*,
t2.ID,
t2.NAME
from TABLE1 t1, TABLE2 t2
where t1.ID = t2.TABLE1_ID
select t1.ID,
t1.NAME,
(select count(*) from TABLE2 t2 where t2.TABLE1_ID = t1.ID ) TABLE2_COUNT
from TABLE1 t1
и прочее...
ИМХО анализировать сие не многим проще (если вообще проще), чем анализировать структуру сложного запроса на предмет отсечения не нужных разделог (сие обсуждаеццо =) ).
MOA (2005-06-09 17:18:00) [27]DECLARE @P1 Integer, @Str nvarchar(2000)
SET @P1=-1
SET @Str= N'Текст Вашего запроса'
EXEC sp_prepare @P1 OUTPUT, NULL, @Str,1
Вернёт Вам пустой набор данных со всеми полями. Варианты понятны (например, не @Str, а :Par) Пусть поработает парсер сервера ;).
Удачи!
Johnmen (2005-06-09 17:17:00) [28]>stelius © (09.06.05 17:05) [10]
Делай разбор того, что идёт посте FROM, с целью найти "хвост" этого перечисления. Ничего сложного здесь нет. Все случаи известны и поддаются однозначному парсированию. (а как же иначе? :))
jack128 (2005-06-09 17:14:00) [29]Sergey13 © (09.06.05 16:55) [8]
Если поддерживается запрос из запроса достаточно
А если не поддерживает, то достаточно выполнить сам запрос.
Anatoly Podgoretsky (2005-06-09 17:06:00) [30]Звезжчка означает все поля.
По другому список полей равен *
stelius (2005-06-09 17:05:00) [31]2Danilka © (09.06.05 16:52) [7]
Oracle и Access
Johnmen (2005-06-09 16:59:00) [32]>stelius © (09.06.05 16:41) [6]
>ценю твой юмор... а если указана звездочка?
Дык...:)
Я твой тоже заценил. По поводу типа СУБД.
:)))
Sergey13 (2005-06-09 16:55:00) [33]Если поддерживается запрос из запроса достаточно
select * from
(исходный запрос)
Where 1=0
Danilka (2005-06-09 16:52:00) [34][6] stelius © (09.06.05 16:41)
Какая СУБД?
stelius (2005-06-09 16:41:00) [35]2Johnmen © (09.06.05 16:28) [5]
ценю твой юмор... а если указана звездочка?
Попутно вопрос...
Как можно посмотреть код, который выплняет UpdateSQL, при нажатии кнопки Get Table Fields в design time.
Johnmen (2005-06-09 16:28:00) [36]>stelius © (09.06.05 16:21) [4]
Список полей находится между SELECT и FROM.
:)
stelius (2005-06-09 16:21:00) [37]2stud © (09.06.05 15:47) [3]
Запрос подаеться как бог на душу положит =)
Чел может и построчно написать, может и в одну строку, а может еще как отфармотировать по своему разумению.. =(
Возможно я просто не там копаю...
Изначально задача - найти список полей которые возвращает запрос. Вот решил взять указанный скуль и выполнить его, но чтоб он данные не возвращал. Затем уж из кверика выдернуть список полей.
stud (2005-06-09 15:47:00) [38]а как подается запрос?
если запрос подавать в виде списка строк
select ....
from....
where ....
то можно удалять строку, которая содержит where
Anatoly Podgoretsky (2005-06-09 15:29:00) [39]Просто только для простых запросов, а для сложных с большой глубиной вложения лучше вешаться.
Для простых запросов порядок жестко определен.
Только как быть с JOIN ведь это по сути тоже самое что и Where
Sergey13 (2005-06-09 15:23:00) [40]2stelius © (09.06.05 15:15)
На первый взгляд можно отсекать по последнему вхождению без скобок (подзапросы).