Запуск хранимой процедуры с параметрами, полученными в результате запроса - PullRequest
1 голос
/ 06 апреля 2010

Нетрудно найти разработчиков , которые считают курсоры неуклюжими , но мне интересно, как решить следующую проблему без таковой:

Допустим, у меня есть процесс с именем uspStudentDelete , который принимает в качестве параметра @ StudentID.

uspStudentDelete применяет кучу каскадных программ мягкого удаления, помечая флажки в таблицах, как "классы", "оценки" и т. Д., Как неактивные. uspStudentDelete хорошо проверен и работает в течение некоторого времени.

Как лучше всего запустить uspStudentDelete по результатам запроса (например, выбрать студента из студентов, где ...) в TSQL ?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2010

Лучшее решение - написать основанный на множестве процесс для обработки удаления (попробуйте запустить его с помощью курсора, чтобы удалить 10000 записей, и вы поймете, почему) или добавить код на основе множества в текущий процесс с помощью параметр, сообщающий вам, следует ли запускать основанную на наборе или единственную часть записи процедуры (это, по крайней мере, сохраняет ее вместе для целей обслуживания).

В SQL Server 2008 вы можете использовать переменную таблицы в качестве входной переменной. Если вы переписываете процесс на основе множеств, вы можете использовать ту же логику и запускать ее независимо от того, отправляет ли он одну запись или десять тысяч. Вам может понадобиться пакетный процесс, чтобы избежать одновременного удаления миллионов записей и блокировки таблиц на несколько часов. Конечно, если вы сделаете это, вам также нужно будет отрегулировать, как вызывается currect sp.

3 голосов
/ 06 апреля 2010

Это именно то, для чего предназначены курсоры:

declare c cursor local for <your query here>
declare @ID int
open c
fetch next from c into @id
while @@fetch_status = 0 
    begin
    exec uspStudentDelete @id
    fetch next from c into @id
    end
close c
deallocate c

Большинство людей, которые ругаются против курсоров, думают, что вы должны сделать это в подходящем клиенте, таком как настольное приложение C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...