2009-05-13 3 views
4

내 질문의 일반화 시도 ... SELECT 문에 의해 반환 된 각 결과에 대해 저장 프로 시저를 실행하려고합니다.각 항목에 대해 EXEC를 호출하는 목록을 반복하는 SQL

정신적으로 나는 EXEC myStoredProc 같은 것을 내 특정한 경우 ... 관련

자세한 내용 나는 SaaS는 응용 프로그램이 (COND = @param이 sometable로부터 ID를 선택)을 시도하려는. 시스템에서 세입자를 삭제하고 싶습니다. 세입자를 삭제하기 전에 해당 세입자와 관련된 데이터베이스의 모든 레코드를 삭제해야합니다.

세입자는 다양한 유형의 필드를 포함하는 양식과 같은 항목을 소유합니다. Form과 그와 관련된 모든 항목 (예 : Fields)을 삭제하는 저장 프로 시저가 이미 있습니다. 유지 보수상의 이유로 (즉, 레코드와 폼 사이의 의존 관계와 연관성을 결정하는 논리를 복제하고 싶지는 않음) 저는 Tenant에 속한 각 Form에 대해 StoredProc이라고 부릅니다.

나는 형태의 쿼리처럼 ... 선택 formId을 실행하여 형태의 목록을 검색 할 수 있습니다 WHERE 거주자 = @TenantId

내가 그 쿼리의 결과와 함께하고 싶은 것은 내 Delete_Form 저장 프로 시저 EXEC입니다 .

어떻게하면됩니까?

+0

어떤 RDBMS를 사용하고 있습니까? –

+0

Microsoft SQL Server 2008 – Justin

답변

6

외부 키를 제어 할 수없고 계단식 삭제를 할 수없는 경우 커서를 만들어 루프를 실행하고 각각에 대해 저장된 proc을 실행할 수 있습니다.

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 
+0

와우 완벽한 감사합니다! – Justin

2

캐스케이드 삭제 기능을 켜고 부모 레코드를 삭제하면 해당하는 모든 하위 레코드가 삭제됩니다.

cursor (SQL Server 용 링크이지만 다른 RDBMS의 커서가 비슷하다고 가정 할 경우)를 생성하고 각 결과를 통해 양식 ID를 추출하고 [ Delete_Field_Procedure]를 입력하십시오.

+0

응답 해 주셔서 감사합니다. 캐스케이드 삭제로 너무 많은 "매직"이 발생하고 실수로 일부 항목이 사라질 수 있습니다. 그래서 나는 당신이 언급 한 커서로 갈거야 :) 고마워. – Justin

관련 문제