Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос без раздела WHERE [D5, D7]


Страницы:   1 2

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)
На первый взгляд можно отсекать по последнему вхождению без скобок (подзапросы).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо