2013-02-28 3 views
0

Je souhaite supprimer un résultat renvoyé par une instruction select, parce que j'ai des relations entre les tables et si je supprime de la première table ses lignes enfants dans d'autres tables à supprimer aussi.Instruction de suppression de la procédure stockée SQL Server

Quelqu'un peut-il corriger cette procédure stockée pour moi s'il vous plaît?

ALTER proc [dbo].[storedprocname] 
    (@Parameter uniqueidentifier = '00000000-0000-0000-0000-000000000000') 
AS BEGIN 
    DELETE FROM TableOne 
    WHERE IDOne IN 
     (SELECT 
      IDOne, 
      DescOne, IndexOne, 
      IDTwo, 
      QuestionTwo, ControlTypeTwo, IndexTwo, 
      IDThree, 
      DescThree, IndexThree, 
      QuestionFour, 
      OptionFour 
    FROM 
      TableOne 
     INNER JOIN 
      TableTwo ON TableTwo.CatID = TableOne.IDOne 
     INNER JOIN 
      TableThree ON TableThree.Question = TableTwo.IDTwo 
     LEFT OUTER JOIN 
      TableFour ON TableFour.Question = TableThree.IDThree 
     WHERE 
      TableOne.IDOne = @Parameter) 
END 

Répondre

1
ALTER proc [dbo].[storedprocname] 
    (@Parameter uniqueidentifier = '00000000-0000-0000-0000-000000000000') 
AS BEGIN 
    DELETE FROM TableOne 
    WHERE IDOne IN 
     (SELECT 
     IDOne 
     FROM 
     TableOne 
     INNER JOIN 
     TableTwo ON TableTwo.CatID = TableOne.IDOne 
     INNER JOIN 
     TableThree ON TableThree.Question = TableTwo.IDTwo 
     LEFT OUTER JOIN 
     TableFour ON TableFour.Question = TableThree.IDThree 
     WHERE 
     TableOne.IDOne = @Parameter) 
END 
1

Puisque vous voulez supprimer toutes les lignes où IDOne est dans une liste de valeurs possibles - alors vous devez vous assurer que la sous-requête après la IN (...) retourne également une seule colonne qui peut être utilisé pour comparer! Après tout, vous ne pouvez pas comparer une seule valeur IDOne à la liste complète des colonnes que vous êtes en train de retour ....

Essayez quelque chose comme ceci:

ALTER proc [dbo].[storedprocname] 
    (@Parameter uniqueidentifier = '00000000-0000-0000-0000-000000000000') 
AS BEGIN 
    DELETE FROM TableOne 
    WHERE IDOne IN 
     (SELECT 
      IDOne 
     FROM 
      TableOne 
     INNER JOIN 
      TableTwo ON TableTwo.CatID = TableOne.IDOne 
     INNER JOIN 
      TableThree ON TableThree.Question = TableTwo.IDTwo 
     LEFT OUTER JOIN 
      TableFour ON TableFour.Question = TableThree.IDThree 
     WHERE 
      TableOne.IDOne = @Parameter) 
END 

Je ne sais pas (votre question est trop vague et pas assez clair) si tous ces JOIN à l'intérieur de la sous-requête sont vraiment nécessaires .... vous pourriez avoir besoin de régler cela à vos besoins.