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

StackOverflow https://stackoverflow.com/questions/859759

Вопрос

Попытайтесь обобщить мои вопросы...Я хочу выполнить хранимую процедуру для каждого результата, возвращаемого инструкцией 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] для каждого из них.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top