Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Можно ли получить список полей запроса не выполняя оный?   Найти похожие ветки 

 
sohat   (2004-01-13 12:11) [0]

Мне нужно вытащить поля запроса, но при этом запрос не выполнять (вдруг он будет здоровый :))) или параметры еще чего доброго попросит ). Можно ли это сделать и как?


 
Desdechado ©   (2004-01-13 12:21) [1]

а запрос-то откуда берется?
это ж строка, вот и проверь все между SELECT и FROM


 
sohat   (2004-01-13 12:27) [2]

ага, со всеми *, as, sum() ... энтак можно свой sql сервер написать :)))


 
Vlad ©   (2004-01-13 12:31) [3]

select <нужные поля> from <нужные таблицы> where 1=0
выполнится мгновенно :-)
список полей будет в свойстве TDataSet.FieldList.


 
Sandman25 ©   (2004-01-13 12:32) [4]

Добавьте в конце and (1=0) и запрос выполнится очень быстро :)


 
Reindeer Moss Eater ©   (2004-01-13 12:36) [5]

TDataSet.FieldDefs.Update


 
Desdechado ©   (2004-01-13 13:03) [6]

ну, * использовать, имхо, дурной тон
sum - отдельное поле, обзывай как хочешшь
as вполне можно обработать

парсер вовсе несложный выходит ;)

про and (1=0) - согласен, изяшный вариант, но не для всех запросов (особенно фраза "добавь в конце")
если всякие having, order, join будут ...


 
Sandman25 ©   (2004-01-13 13:06) [7]

фраза "добавь в конце" означала добавление в секцию where. Впрочем, это уже детали.


 
Плохиш_   (2004-01-13 13:08) [8]

Можно ли получить список полей запроса не выполняя оный?

В обшем случае нет


 
Vemer ©   (2004-01-13 13:11) [9]

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


 
Vlad ©   (2004-01-13 13:12) [10]


> Desdechado © (13.01.04 13:03) [6]
> про and (1=0) - согласен, изяшный вариант, но не для всех
> запросов (особенно фраза "добавь в конце")
> если всякие having, order, join будут ...

что мешает написать что-то вроде:
select <поля>
from <таблицы>
where <условие связки> and :MyParameter = 0
group by...
order by...

Подставляй вместо :MyParameter или 0 или 1 в зависимости от желаемого результата


 
Ega23 ©   (2004-01-13 13:35) [11]

в MS SQL есть такая штука
Select top N * from ....


 
Vemer ©   (2004-01-13 13:58) [12]

To Ega23
Она не только в Мускуле есть. Но так ты получишь не все данные... ТOP хорош, когда "золотую" десятку клиентов/товаров вывести надо...


 
sohat   (2004-01-13 14:44) [13]

Короче говоря все сходятся в том, что запрос все одно придется выполнить, предварительно видоизменив его, вписав секцию where.
А как быть если у книть запроса будут параметры?

Может ежели поясню задачку кто нить, что более дельное предложить.
Есть некая табличка с запросами, и табличка с описанием полей этого запроса (русская интерпритация поля, ширина поля в гриде, цвет, ....). При настройке приложения, после создания запроса, удовлетворяющего определенным нуждам, нужно описать поля данного запроса. Вот и возник вопрос, как получить список полей. Естественно, что запросы могут быть любыми, и секция where во многих из них может быть прописана. кроме того могут использоваться параметры.


 
Vlad ©   (2004-01-13 14:52) [14]

Во первых непонятно, если уже есть готовая табличка с описанием полей запроса, то почему нельзя список полей вытащить из этой таблицы ?
Во вторых, обрати внимание на Vlad © (13.01.04 13:12) [10]
в этом примере как раз с параметром.
Даже если секция where хранится отдельно в таблице, то ее нетрудно модифицировать на клиенте, добавив в конец " and 0=1"


 
sohat   (2004-01-13 15:02) [15]

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

по поводу второго - запросы довольно сложные, и анализировать их мне неохота, я думал можно получить список полей посредством TDataSet


 
Vlad ©   (2004-01-13 15:06) [16]


> я думал можно получить список полей посредством TDataSet

Сказали же - можно.
DataSet.FieldList
Но вот только откуда DataSet по-твоему возьмет этот список полей без запроса на сервер ? DataSet, он ведь не ясновидящий :-)
Или, если есть лишнее время, займись разбором строки, а именно секции where - тоже вариант.


 
sohat   (2004-01-13 15:10) [17]

Если эта секция вообче есть :)


 
Reindeer Moss Eater ©   (2004-01-13 17:55) [18]

TDataSet.FieldDefs.Update

Будет ли получен список полей?
Будет.

Будет ли выполняться запрос?
Не будет.


 
Vlad ©   (2004-01-13 18:00) [19]


> Reindeer Moss Eater © (13.01.04 17:55) [18]

Запрос будет послан на сервер, другое дело, что DataSet при этом не будет открыт.


 
Johnmen ©   (2004-01-13 18:01) [20]

>Reindeer Moss Eater © (13.01.04 17:55)

Откуда будет получен ? Без запроса то...


 
Sandman25 ©   (2004-01-13 18:03) [21]

[20] Johnmen © (13.01.04 18:01)

Я думаю, что будет. Как показал TSQLMonitor, при работе через DBExpress если не прописаны явно Fields, то перед выполнением запроса генерируются и выполняются запросы к системным таблицам, для определения типов полей.


 
Reindeer Moss Eater ©   (2004-01-13 18:11) [22]

Если запрос выполняется, то где хотя бы одна запись?


 
Vlad ©   (2004-01-13 18:13) [23]


> Sandman25 © (13.01.04 18:03) [21]

А если их нет (системных таблиц) ? :-)


> Reindeer Moss Eater © (13.01.04 18:11) [22]

Запрос выполняется. Это легко проверить. Напиши какой нибудь неоптимизированный запрос по огромной таблице и попробуй сделать FieldDefs.Update. Сколько этот апдейт времени займет ?


 
Johnmen ©   (2004-01-13 18:14) [24]

>Sandman25 © (13.01.04 18:03)

Что-то я тебя сегодня не понимаю... Ты о чем ? А я о чем ?
:)))


 
Sandman25 ©   (2004-01-13 18:19) [25]

[23] Vlad © (13.01.04 18:13)

Если их нет, то, возможно, анализом SQL занимается BDE. Не зря у него свой особый SQL.

[24] Johnmen © (13.01.04 18:14)

Сегодня 13-ое :)
А если серьезно, то между IB и Informix огромная разница в подходах, наложившая отпечаток на наше мировоззрение, мироощущение и мировосприятие :)


 
Johnmen ©   (2004-01-13 18:23) [26]

>Sandman25 © (13.01.04 18:19)

Ну причем же здесь Informix ????? (Тем более, что и с ним я тоже работал)
Я не говорил, что не будет. Я намекал, что запрос будет выполнен в любом случае !

Наверное, все-таки, 13-е. Е-е...:)


 
Sandman25 ©   (2004-01-13 18:26) [27]

[26] Johnmen © (13.01.04 18:23)

Насчет Informix я говорил, имея ввиду сегодняшний диспут о полезности временных таблиц. Посмотрим, что будет завтра :)


 
Sandman25 ©   (2004-01-13 18:28) [28]

[26] Johnmen © (13.01.04 18:23)

Кстати, держу пари, что при работе на Informix ты не использовал TEMP TABLE WITH NO LOG.
Аналогично я не привык использовать update table1, table2 или select from (select union select)


 
Johnmen ©   (2004-01-13 18:31) [29]

>Sandman25 © (13.01.04 18:28)

Не использовал. Пари отменяется...:)
И остальные, тобою указанные конструкции, не использую. Т.к. они очень специфичны.


 
Sandman25 ©   (2004-01-13 18:34) [30]

Согласен. При переходе на другую СУБД не надо будет ничего изменять, если использовался стандарт SQL.


 
Reindeer Moss Eater ©   (2004-01-13 19:56) [31]

Запрос будет выполнен сервером, но фетча не будет.
На клиенте не будет записей.
Это все равно, что запрос не выполнился (с точки зрения клиента)


 
Johnmen ©   (2004-01-13 22:35) [32]

>Reindeer Moss Eater © (13.01.04 19:56)

Когда я говорил, что запрос будет выполнен, я не имел в виду выполнение именно запроса select * ... !
А имел в виду, что будет выполнен "какой-то" запрос, на основании выполнения которого будут получены сведения о полях. И этот "какой-то" запрос зависит от движка, от компонент доступа. И выполнится он неявно.


 
kaif ©   (2004-01-14 01:21) [33]

По-моему лучше всего взглянуть в исходный текст компонентов IBX и посмотреть, как они извлекают список полей до того, как запрос будет открыт. Насколько я помню, они обращаются к системным таблицам IB.


 
dummy   (2004-01-15 12:53) [34]

Thanks! Сделал, может, кому сгодится:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
i: integer;
begin
s:= "";
for i:= 0 to table1.FieldDefs.Count-1 do
s := s+table1.FieldDefs[i].Name+#13+#10;
ShowMessage(s);
end;


 
Vlad ©   (2004-01-15 12:55) [35]


> dummy (15.01.04 12:53) [34]

Спасибо, друг!
Я так долго искал, где бы нарыть такую классную процедуру! :-)



Страницы: 1 вся ветка

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.02 c
3-16157
Layner
2004-01-14 09:53
2004.02.06
Знатоки, как определить, какая версия ADO стоит на машине юзера?


3-16078
BorisUK
2004-01-12 09:46
2004.02.06
порты по которым работает DCOM


1-16490
andrew_p
2004-01-22 13:58
2004.02.06
Перевод MessageDLG


1-16355
Ivolg
2004-01-24 14:37
2004.02.06
Как у ВинАмпа


14-16639
MV
2004-01-14 15:54
2004.02.06
Все равно Делфай не брошу!