Bezdepbonusu7Программирование: статьи и ответы

Вопрос

SQL перебирает список для вызова EXEC для каждого элемента

Автор вопроса: JustinОтветов: 2

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

Мысленно я хочу попробовать что-то вроде EXEC myStoredProc (SELECT id FROM sometable WHERE cond = @param)

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

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

Я могу получить список форм, выполнив запрос типа... Select formId FROM Forms WHERE Tenant = @TenantId

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

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

sqlloopsexecstored-proceduresiteration

Ответы

Ответ 1 · рейтинг 8 · Scott Ivey

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

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 · рейтинг 2 · kemiller2002

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы