Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помощь в написании "цикла"  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
Здравствуйте! :)

Проблема следующая, требуется написать "цикл", а может конечно это можно сделать и по другому, в котором запускалась процедура с 3 параметрами.

Дано:

dbo.procedure @param1, @param2, @param3
-- добавляет найденную строку в таблицу

dbo.table1 (c1, c2, c3, c4, c5, c6, c7, c8, c9, c10)
-- таблица в которую добавляем значения полученные из процедцры

Сейчас:
В процедуре имеется 10 переменных, в которые записывается результат, полученный используя параметры переданные в процедуру.
SELECT * 
FROM table2 
WHERE v1=@param1 AND v2=@param2 AND v3=@param3 AND v4=1

таких селектов несколько с разным значением v4
Если запрос вернул NULL пишем в переменную "0". Далее все 10 переменных записываются в table1.

Процедура выполняется несколько десятков раз (@param1 @param2 @param3 - это списки)


Требуется:
что что вроде запуска 3х уровневого цикла, типа:
for (p1: @param1) {
    for (p2: @param2) {
        for (p3: @param3) {
            dbo.procedure p1, p2, p3
        }
    }
}


Нашел что это можно сделать при помощи курсоров, но некоторые пишут что это не есть хорошо. Может кто-нибудь подскажет как это лучше всего сделать или в какую сторону копать. :)

P.S. Если что то непонятно написал, спрашивайте. :)

Спасибо.
11 ноя 18, 12:29    [21730905]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20181
А почему все эти циклы и вставки не делать прямо в процедуре-то?
11 ноя 18, 13:43    [21730948]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
Lomaster_
Member

Откуда:
Сообщений: 12
Она ещё в других местах используется )
11 ноя 18, 14:11    [21730978]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20181
Ну в обрамляющей процедуре...
11 ноя 18, 15:40    [21731032]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
AndrF
Member

Откуда:
Сообщений: 2183
WHILE - чем не устраивает?
11 ноя 18, 16:38    [21731069]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30735
Lomaster_
Нашел что это можно сделать при помощи курсоров, но некоторые пишут что это не есть хорошо. Может кто-нибудь подскажет как это лучше всего сделать или в какую сторону копать. :)
Циклы в MSSQL делаются с помощью WHILE, а перебирать списки (наверное, имеются в виду таблицы со значениями?) можно курсорами, ну или можно имитировать их, доставая очередную запись, и удаляя её после обработки.
Ничего страшного в курсорах нет, они как раз предназначены для перебора значений.

"некоторые пишут что это не есть хорошо" - имеется в виду то, что лучше обрабатывать записи вместе, а не перебирать их по одной, но если уж вам нужно их перебрать для вызовов процедуры, то используйте курсор.
11 ноя 18, 19:10    [21731146]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
alexeyvg
Lomaster_
Нашел что это можно сделать при помощи курсоров, но некоторые пишут что это не есть хорошо. Может кто-нибудь подскажет как это лучше всего сделать или в какую сторону копать. :)
Циклы в MSSQL делаются с помощью WHILE, а перебирать списки (наверное, имеются в виду таблицы со значениями?) можно курсорами, ну или можно имитировать их, доставая очередную запись, и удаляя её после обработки.
Ничего страшного в курсорах нет, они как раз предназначены для перебора значений.

"некоторые пишут что это не есть хорошо" - имеется в виду то, что лучше обрабатывать записи вместе, а не перебирать их по одной, но если уж вам нужно их перебрать для вызовов процедуры, то используйте курсор.
Курсор как раз и обходится обычно в цикле WHILE. Так что как их можно противопоставлять?
11 ноя 18, 20:07    [21731190]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
Lomaster_,

Ну совсем непонятно как и что должно работать. Тут три переменные, тут их десять.
Никакого алгоритма "цикла" не описано. Есть ощущение, что вы пытаетесь работать с данными в БД как в обычном языке программирования - построчно, отсюда for и циклы.
11 ноя 18, 20:42    [21731221]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30735
iap
Курсор как раз и обходится обычно в цикле WHILE. Так что как их можно противопоставлять?
Может, я не очень удачно выразился, непонятно для ТС...
Я имел в виду, что нужно сделать цикл, но записи перебирать в нём можно не только с помощью курсора.
Так что в принципе курсоры и циклы разные понятия, их нельзя ни противопоставлять, ни отождествлять :-)
11 ноя 18, 23:15    [21731282]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7391
Lomaster_,

t-SQL это декларативный язык, на нем надо писать "что делать", а не "как делать". Если вы будете писать обработку каждого значения и каждой строки декларативно, то получите значительное снижение производительности. Чтобы все работало быстро, сперва необходимо перенести список на сервер, затем выполнить по отношению к списку запрос.
12 ноя 18, 13:53    [21731762]     Ответить | Цитировать Сообщить модератору
 Re: Помощь в написании "цикла"  [new]
SQLPowerUser
Member

Откуда: ссылка в профиле
Сообщений: 330
Lomaster_,

???
https://www.sql.ru/faq/faq_topic.aspx?fid=114
12 ноя 18, 15:31    [21731915]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить