2013-08-01 179 views
1

我試圖使用以下存儲過程的數據庫中刪除父和子記錄:刪除父和子記錄

CREATE PROCEDURE [dbo].[DeleteCompanyPersonAndPhoneNumbers] (
    @personId int, 
    @deleted bit output) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET XACT_ABORT ON; 

    set @deleted = 0 

    begin transaction 

     -- delete the phone numbers 
     delete from PersonalPhoneNumber 
      where PersonalPhoneNumber.PersonId = @personId 

     delete from ProfessionalProfile 
      where ProfessionalProfile.Person_Id = @personId 

     delete from aspnet_UserProfile 
      where aspnet_UserProfile.Person_ID = @personId 

     delete from Accreditation 
      where Accreditation.Person_ID = @personId 

     delete from Qualification 
       where Qualification.Person_ID = @personId 

     delete from PERSON where Person_ID = @personId 

     set @deleted = 1 

    commit transaction 

END 

我已經設置了外鍵強制關閉。運行sp時,它只會刪除父記錄。

我在做任何錯誤的SP?

感謝

+0

似乎也可以刪除孩子; http://sqlfiddle.com/#!6/55fd5/1 –

+0

你的做法是相當於#2這個問題:http://stackoverflow.com/questions/17855349/sql-server-recursive-delete它看起來像你的代碼應該工作。它真的會從PERSON中刪除一行匹配personId但不從子項中刪除的行嗎?這個人的確很匹配? –

+0

我需要看到你必須給你確切代碼的表格。我知道你必須從最後一張桌子開始,逐步走上梯子去除所有的孩子和父母。 – JayKlassen

回答

3

你必須設置外鍵執行上刪除對通過級聯刪除在子表中的記錄。禁用外鍵也是不好的數據庫設計,可能會讓你陷入困境。

+0

這是迄今爲止最好的方法。 – SDReyes

+0

雖然我會建議您要麼強制執行外鍵,要麼在父表的刪除事件上創建觸發器,以從子表中刪除記錄。但是,如果您想堅持使用相同的方法,請確認通過PersonId參數傳遞的值是什麼,請嘗試在過程中包含Print語句以確認是否將正確的值傳遞給PersonId參數。 – Sonam