SQL перебирает список для вызова EXEC для каждого элемента
-
21-08-2019 - |
Вопрос
Попытайтесь обобщить мои вопросы...Я хочу выполнить хранимую процедуру для каждого результата, возвращаемого инструкцией SELECT.
Мрально я хочу попробовать что -то вроде Exec MyStoredProc (выберите идентификатор из -за чего -то, где cond = @param)
Подробнее о моем конкретном случае...У меня есть SaaS-приложение.Я хотел бы удалить арендатора из системы.Прежде чем я смогу удалить арендатора, я должен удалить все записи в базе данных, связанные с этим арендатором.
Арендаторы владеют такими элементами, как формы, которые содержат множество различных типов полей.У меня уже есть хранимая процедура, которая удаляет форму и все связанные с ней элементы (например, поля).По причинам технического обслуживания (т.не хотел дублировать логику, определяющую зависимости и связи между записями и формой) Я бы хотел просто вызывать этот StoredProc для каждой формы, принадлежащей арендатору.
Я могу получить список форм, выполнив запрос типа...Выберите formId ИЗ Форм ГДЕ Tenant = @TenantId
С результатом этого запроса я хочу выполнить EXEC моей хранимой процедуры Delete_Form.
Как я могу это сделать?
Решение
В случае, когда у вас нет контроля над внешними ключами и вы не можете выполнять каскадное удаление, вы можете создать курсор для циклического прохождения и выполнения сохраненной процедуры для каждого из них.
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
Другие советы
Вы можете просто включить каскадное удаление, и удаление родительской записи приведет к удалению всех связанных с ней дочерних записей.
Если нет, вам придется создать курсор (Ссылка предназначена для сервера sql, но я предполагаю, что курсоры для других СУБД аналогичны) и просматриваю каждый из результатов, извлекая идентификатор формы и выполняя [Delete_Field_Procedure] для каждого из них.