Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.033 c
1-16485
Sash1
2004-01-27 10:52
2004.02.06
Проблема с record в property


3-16167
bushmen
2004-01-14 12:59
2004.02.06
Изменение цвета записи в DbGrid


1-16492
Islander
2004-01-27 22:17
2004.02.06
Где хранить настройки в 200x/XP?


14-16664
K.o.Z
2004-01-12 03:20
2004.02.06
Странно


14-16712
_none_
2004-01-16 19:37
2004.02.06
кто-нибудь знает, есть ли аналог старой игрушки mine bombers 3 ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский