![]() |
|
Модераторы: Akina |
![]()
|
|
| default_user |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.12.2006 Где: Москва Репутация: нет Всего: 1 |
Доброго времени суток всем!
Я совсем немного времени работаю с 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 |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 14.3.2005 Репутация: 17 Всего: 20 |
1 вариант: использовать
2 вариант: оформить UsersAccess в виде функции
и использовать в запросе
|
||||||
|
|||||||
| default_user |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.12.2006 Где: Москва Репутация: нет Всего: 1 |
Спасибо за совет!
Я вот пытаюсь реализовать это с помощью курсоров, но в виде функции будет работать быстрее, да? И еще маленький вопрос. Как сделать, чтобы в результат не включался результирующий набор вызова какой-нибудь промежуточной процедуры? А то в query analizer я получаю два окна результатов. Это сообщение отредактировал(а) default_user - 28.12.2006, 10:44 |
|||
|
||||
| SergKO |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 14.3.2005 Репутация: 17 Всего: 20 |
1. Да. Быстрее курсоров.
2. В queryanaliser'е Вы будете видеть столько наборов, сколько "попросили". Если у Вас появляются "лишние" наборы, значит где-то неверно используется эта самая промежуточная процедура. |
|||
|
||||
| default_user |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.12.2006 Где: Москва Репутация: нет Всего: 1 |
Мои результаты
С функцией все работает, только условие нужно вписать не в join, а в секцию where после join. (Это я так, мало ли пригодится кому). А вот первый вариант с #table что-то не получился Может я чего недопонимаю? Объясните, плз, значение символа #
|
|||
|
||||
| SergKO |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 231 Регистрация: 14.3.2005 Репутация: 17 Всего: 20 |
Перед выполнением конструкции
необходимо создать временную таблицу #Table (символ # говорит о том, что она временная)
т.е.
Добавлено @ 11:12 Кстати, если Вы посмотрите план запроса, то условие
должно быть преобразовано оптимизатором в
Тогда, сначала будет произведена выборка по этому условию, и только потом JOIN с reestr |
||||||||||
|
|||||||||||
| default_user |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 27.12.2006 Где: Москва Репутация: нет Всего: 1 |
SergKO,
Спасибо вам большое-пребольшое!!! |
|||
|
||||
![]()
|
| Правила форума "MS SQL" | |
|
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS SQL Server | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |