Форум: "Базы";
Текущий архив: 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