| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MS SQL Server > Использование результата одной процедуры в другой |
| Автор: default_user 27.12.2006, 15:38 | ||||
| Доброго времени суток всем! Я совсем немного времени работаю с MS SQL, у меня возникают некоторые затруднения, касательно написания хранимых процедур, т.к. логика их построения отличается от процедур на Interbase (с которым некоторый опыт имеется), по крайней мере, мне так кажется Так вот. Возникла такая проблема. У меня есть процедура, которая возвращает некоторый набор данных. Далее, мне нужно использовать этот набор в другой процедуре как условие запроса. Каким образом можно это сделать, не используя промежуточных таблиц? И можно ли вообще объединить эти две процедуры в одну? Мне нужен аналог оператора for select из Interbase (который делает какие-либо действия для каждой строки из выборки, в том числе и другие выборки). Первая процедура (определяет пользователей, которых "видит" данный по статусу):
Во второй производится выборка и суммирование, которую нужно провести только для записей этих пользователей. То есть, нужен либо цикл по каждому значению из первой процедуры (как???), либо условие where create_user in (*результирующий набор из процедуры 1*). Только как его сюда вписать этот набор? варианты in (select [user_id] from UsersAccess и in (execute UsersAccess @login=@ID, @pass=@Pswd) не проходят
|
| Автор: SergKO 28.12.2006, 06:39 | ||||||
1 вариант: использовать
2 вариант: оформить UsersAccess в виде функции
и использовать в запросе
|
| Автор: default_user 28.12.2006, 10:08 |
| Спасибо за совет! Я вот пытаюсь реализовать это с помощью курсоров, но в виде функции будет работать быстрее, да? И еще маленький вопрос. Как сделать, чтобы в результат не включался результирующий набор вызова какой-нибудь промежуточной процедуры? А то в query analizer я получаю два окна результатов. |
| Автор: SergKO 28.12.2006, 10:27 |
| 1. Да. Быстрее курсоров. 2. В queryanaliser'е Вы будете видеть столько наборов, сколько "попросили". Если у Вас появляются "лишние" наборы, значит где-то неверно используется эта самая промежуточная процедура. |
| Автор: default_user 28.12.2006, 10:44 | ||
| Мои результаты С функцией все работает, только условие нужно вписать не в join, а в секцию where после join. (Это я так, мало ли пригодится кому). А вот первый вариант с #table что-то не получился Может я чего недопонимаю? Объясните, плз, значение символа #
|
| Автор: SergKO 28.12.2006, 11:06 | ||||||||||
Перед выполнением конструкции
необходимо создать временную таблицу #Table (символ # говорит о том, что она временная)
т.е.
Добавлено @ 11:12 Кстати, если Вы посмотрите план запроса, то условие
должно быть преобразовано оптимизатором в
Тогда, сначала будет произведена выборка по этому условию, и только потом JOIN с reestr |
| Автор: default_user 28.12.2006, 11:37 |
| SergKO, Спасибо вам большое-пребольшое!!! |