Привет :)
??>> А что мешает это сделать сразу запросом в PROC2? И вернуть уже
??>> сгруппированную таблицу?
SD> Ну, в Proc1 запрос строится с учетом параметров. в вот в прок 2,
SD> хотелось осузествлять группировку.
Ну и пусть строится с учетом параметров... Какая разница? Сразу и
сгруппировать при выдаче результата. Хотя это уже хозяйское дело :) Кста,
функции тоже можно делать с параметрами (это я на всякий случай напоминаю
:))
??>> В любом случае, в PROC1 после получения данных в #procTable можно
??>> сделать:
SD> DECLARE @groupedTable TABLE (MyFiled varchar(250))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Это здесь не нужно. Данная конструкция создает не временную таблицу, а
табличную переменную. Количество отличий между ними небольшое, но они
существенны. Если интересно, могу отдельно рассказать, хотя в BOL это
подробно расписано.
SELECT INTO же с табличными переменными не работает, как уже заметил Дмитрий
Новиков.
SD> SELECT MyFiled INTO #groupedTable FROM #procTable GROUP BY MyFiled
SD> Вот здесь не получается... при созхранении пишет, что некорректный
SD> синтаксис около #groupedTable
Странно... Все верно написано. У меня сейчас отработало. Можешь полностью
код привести?
При использовании SELECT INTO конечная таблица создается автоматически, в
соответствии с перечнем полей в SELECT и их типами. Потому явно создавать
таблицу не надо. Более того, на момент выполнения SELECT INTO такой таблицы
не должно еще существовать.
Можно заполнить временную таблицу данными и таким образом:
CREATE TABLE #groupedTable (MyField VARCHAR(250))
INSERT INTO #groupedTable
SELECT SELECT MyFiled FROM #procTable GROUP BY MyFiled
Но такая запись длиннее, и, кроме того, требует явного указания перечня
полей искомой таблицы при ее создании. SELECT INTO упрощает эту задачу.
Цитата из BOL:
"The SELECT INTO statement creates a new table and populates it with the
result set of the SELECT statement. SELECT INTO can be used to combine data
from several tables or views into one table. It can also be used to create a
new table that contains data selected from a linked server.
The structure of the new table is defined by the attributes of the
expressions in the select list."
SD> в FB я бы сделал примерно так:
SD> FOR
SD> SELECT MyField FROM groupedTable
SD> INTO :MyField
SD> DO
SD> BEGIN
SD> FOR
SD> SELECT ID, F1, F2, F3 FROM MyTable2
SD> INTO :ID, :F1, :F2, :F3
SD> WHERE F1 = :MyField
SD> DO
SD> suspend;
SD> END
Гм...
Последним оператором процедуры в MS SQL в этом случае будет нечто вроде:
SELECT t1.ID, t1.F1, t1.F2, t1.F3
FROM
MyTable2 t1
INNER JOIN
#groupedTable t2
ON t2.MyField = t1.F1
ORDER BY
t2.F1
Имхо, даже в IB такая конструкция будет проще и красноречивее :) Заодно -
эффективнее. Ибо позволяет серверу построить наиболее эффективный план
запроса. Т.е.:
FOR
SELECT t1.ID, t1.F1, t1.F2, t1.F3
FROM
MyTable2 t1
INNER JOIN
groupedTable t2
ON t2.MyField = t1.F1
INTO :ID, :F1, :F2, :F3
ORDER BY
t2.F1
DO
suspend;
При работе с данными в любой реляционной БД от процедурного подхода надо
отвыкать ;)
--
С уважением, Сергей.
***@energomash.ru
ICQ: 63474652
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru