SQL перебирает список для вызова EXEC для каждого элемента - PullRequest
4 голосов
/ 13 мая 2009

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

Мысленно я хочу попробовать что-то вроде EXEC myStoredProc (ВЫБЕРИТЕ ИД ИЗ СКОБЫГО ГДЕ cond = @param)

Подробнее о моем конкретном случае ... У меня есть приложение SaaS. Я хотел бы удалить арендатора из системы. Прежде чем я смогу удалить клиента, я должен удалить все записи в базе данных, связанные с этим клиентом.

Арендаторам принадлежат такие предметы, как формы, которые содержат много различных типов полей. У меня уже есть сохраненный процесс, который удаляет форму и все связанные с ней элементы (например, поля). По причинам обслуживания (т. Е. Не хотелось дублировать логику, которая определяет зависимости и ассоциации между записями и формой), я хотел бы просто вызвать этот StoredProc для каждой формы, принадлежащей Арендатору.

Я могу получить список форм, выполнив запрос как ... Выберите форму ИЗ ФОРМ, ГДЕ Арендатор = @ TenantId

Что я хочу сделать с результатом этого запроса, так это EXEC моя хранимая процедура Delete_Form.

Как я могу это сделать?

Ответы [ 2 ]

6 голосов
/ 13 мая 2009

В случае, если у вас нет контроля над внешними ключами и вы не можете выполнять каскадное удаление, вы можете создать курсор для циклического выполнения и выполнить сохраненный процесс для каждого.

declare @formID int
declare FormsCursor cursor fast_forward for Select formId FROM Forms WHERE Tenant = @Tenant

open FormsCursor

fetch next from FormsCursor into @formID

while @@fetch_status = 0
begin

   exec Delete_Form @formID

   fetch next from FormsCursor into @formID

end

close FormsCursor
deallocate FormsCursor
2 голосов
/ 13 мая 2009

Вы можете просто включить Cascade delete, а удаление родительской записи приведет к удалению всех дочерних записей, связанных с ней.

Если нет, вам придется создать курсор (ссылка для сервера sql, но я бы предположил, что курсоры для других СУБД похожи) и перебрать все результаты, вытягивая форму id и выполнение [Delete_Field_Procedure] для каждого.

...