![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли сделать SQL запрос внутри Дельфи к результатам запроса в [D5, MSSQL]
theEnter © (2002-10-14 08:55:00)Можно ли сделать SQL запрос внутри Дельфи к результатам запроса выполненного на сервере?
:-) Дело в том что когда я делаю обыкновенный запрос к SQL Server , то иногда мне нужно эти результаты обработать более детально, а бегать в цикле по полям ADOQuery1.Fields[i] неудобно - ведь результат запроса - таблица и к ней логичнее применить SQL запрос ! Заранее спасибо!
Adony (2002-10-16 10:32:00) [1]2 mtihonov
это не совсем то, что требуется.
т.к. таблица все-равно будет создана на сервере :)
SeB (2002-10-15 17:27:00) [2]2petrov
А нельзя ли поподробнее про компоненты, которые делают запросы из датасета? Где скачать можно?
MegaBass (2002-10-15 12:09:00) [3]проще TClientDataset там есть BeforeGetRecord --OwnerData
можешь передавать на сервер любые данные
я делаю так с дополнительными WHERE условиями.
perov (2002-10-15 10:59:00) [4]отправил на мыло.
theEnter (2002-10-15 10:07:00) [5]perov © : Интересно а что это за компоненты ? Если нестандартные, то где их можно взять ?
perov (2002-10-15 07:51:00) [6]есть компоненты, которые делают запросы из любогодатасета. (правда я ими не пользовался)
mtihonov (2002-10-15 06:24:00) [7]Рассмотри следующее предложение:
В текущем Connecte (это обязательно) создаешь временную таблицу
SELECT Field1,Field2,...
INTO #TempTableName
FROM MyTable
WHERE <Условия>
Для данного Connect"а будет создана временная таблица. Для этого Connect"а ее имя будет #TempTableName, на самом деле ее имя будет #TempTableName___________XXXXX. Далее можешь работать с этой временной таблицей:
SELECT Field1,Field2,...
FROM #TempTableName
WHERE <Условия>
После закрытия Connect"а таблица #TempTableName будет автоматически уничтожена. Эта таблица видна только в данном Connect"е для тебя. Если хочешь чтобы временная таблица была видна другим пользователям - назови ее ##TempTableName.
Насчет уничтожения такой таблицы ничего сказать не могу - не проверял. Читай Help по MS SQL.
Max Zyuzin (2002-10-14 12:07:00) [8]>22606 © (14.10.02 11:26)
;о)
passm (2002-10-14 12:01:00) [9]theEnter (14.10.02 11:54)> Для автоматической установки типа/значений параметров в запросе. Т. е. если в запросе Query1 имеется параметр "PARAM1" и указан DataSource, то перед открытием/исполнением если в источнике DataSource будет найдено поле PARAM1, то фактически выполнится Query1.ParamByName("PARAM1").AssignField(FieldByName(DataSource.DataSet.FieldByName("PARAM1")))
ЮЮ (2002-10-14 11:56:00) [10]Для организации связи Master-Detail. Разве в Helpe об этом не написано???
theEnter (2002-10-14 11:54:00) [11]passm ©: Что такое вложеный запрос я знаю, но зачем тогда в TQuery поле DataSource ?
22606 (2002-10-14 11:51:00) [12]Если вопрос стоит именно так, то никак.
Здесь Вы, скорее всего, представляете, что первый запрос выполнился и выполнять его вторично нет смысла, то это не совсем так, так как результаты первого запроса все-равно хранятся на сервере до того момента, пока Вы не вытяните его на клиента, а как кто-то здесь уже отвечал (кстати тот-же Max Zyuzin ©), это может быть более долгим и ресурсоемким, чем выполнить все на сервере - то-ли одним запросом то-ли с помощью View.
passm (2002-10-14 11:47:00) [13]theEnter (14.10.02 11:39)> Тебе все равно не сделать то, что ты хочешь - запрос выполняется на сервере и над данными расположенными в БД. Выполнить запрос на результат - это фантастика :-).
Тебе же народ предлагает конструкцию:
SELECT T1.*
FROM (SELECT Q1...
FROM TABLE1 AS Q1) AS T1(FIELD1,.. FIELD_N)
Вложенный запрос наз-ся.
theEnter (2002-10-14 11:39:00) [14]22606 © :
>Тогда нет никаких препятствий - создавай View
Вы имеете в виду создать View на сервере? Исли так тогда - Чем это лучше простого обращения к Серверу обычным запросом ? Если не понял - извините, но всетаки проблема осталась: как мне указать что источником для запроса Query является другой запрос ADOQuery ?
passm (2002-10-14 11:37:00) [15]22606 © (14.10.02 11:26)> Разбиение запросов на просмотры нужно не столько серверу сколько пользователю/программисту для облегчения его понимания/написания, многократного использования и предоставления защищенных данных пользователям (правильное применение запросов уменьшает вероятность несанкционированного доступа к данным).
22606 (2002-10-14 11:26:00) [16]Да, спасибо, Max Zyuzin ©, я уже после своего ответа это увидел, но и Вы внимательнее читайте ответ :-) - оба раза я предположил, что скорее всего все можно оформить в один запрос.
Но очень часто бывает, что и первичный запрос очень навороченный и быстрее сделать два, чем втолковать серверу в одном запросе чего от него хотят.
22606 (2002-10-14 11:16:00) [17]Сорри, не заметил, что в вопросе ты указал сервер - MSSQL.
Тогда нет никаких препятствий - создавай View.
Хотя, повторюсь, возможно можно и в рамках одного запроса все сделать.
Max Zyuzin (2002-10-14 11:14:00) [18]>22606 © (14.10.02 11:10)
Внимаетельнее читай вопрос, там указан сервер MSSQL. Предложение со View разумно, но возможно все можно офрмить одним запросом...
22606 (2002-10-14 11:10:00) [19]Если даже допустить, что ...
> ...результат запроса - таблица и к ней логичнее применить SQL запрос ...
То у тебя на компьютере по крайней мере должен быть сервер, который этот запрос обработает.
А вообще для начала хотя-бы сообщи с каким сервером ты работаешь - Oracle, IB...(а может вообще с локальными таблицами ???), где запущен сервер (на локальной машине или выделенной, как часто будет выполняться такой запрос)
Если отбросить вероятность того, что данную операцию "Ы" нельзя выполнить в рамках одного запроса (а скорее всего все-таки можно), то мне больше нравится предложение Reindeer Moss Eaterс применением View, если конечно используемый сервер дает такую возможность.
То есть вместо Select"a создаешь View, а потом к нему обращаешься как к таблице. View , кстати, можно и не удалять, если данная операция ("Ы") :-) будет часто выполняться.
MishaH (2002-10-14 10:11:00) [20]В ADOQuery есть свойство Recordset - к нему можно применить фильтр: ADOQuery.Recordset.Filter = "Field like ""%ля-ля%"" and ...". Убрать фильтр: ADOQuery.Recordset.Filter = ""
Это не поможет (писал по памяти, остальное есть в справке)