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

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

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

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

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

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

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

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


person Justin    schedule 13.05.2009    source источник


Ответы (2)


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

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
person Scott Ivey    schedule 13.05.2009

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

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

person kemiller2002    schedule 13.05.2009
comment
Спасибо за ответ, Кевин. Я чувствую, что при удалении Cascade происходит слишком много волшебства, и некоторые вещи могут случайно исчезнуть. Так что я использую курсоры, о которых вы упомянули :) Спасибо. - person Justin; 14.05.2009