2009-10-21 7 views
0

Ceci est ma procédure stockée qui supprime des lignes en fonction de tableau qui lui a été passé en paramètre XML:appel procédure stockée et le passage de paramètres d'une autre procédure stockée

BEGIN 

DECLARE @docHandle int 
EXEC sp_xml_preparedocument @docHandle OUTPUT, @XMLDoc 

DELETE Comments WHERE 
     ID IN (SELECT * FROM OPENXML(@docHandle, '/values/value1', 2) WITH (value1 INT '.')) 

EXEC sp_xml_removedocument @docHandle 
END 

Maintenant, au lieu de SUPPRIMER je veux appeler à un autre procédure stockée (qui exécute la suppression hiérarchique, il reçoit le paramètre ID)

Comment puis-je faire cela?

MISE À JOUR: ceci est mon deuxième SP:

(
    @ID int 
) 
AS 
IF @ID<>1 
BEGIN 
    CREATE TABLE #nodesC (id int primary key) 
    INSERT INTO #nodesC (id) VALUES (@ID) 

    WHILE @@rowcount > 0 
     INSERT INTO #nodesC 
     SELECT child.ID 
     FROM Comments child 
     INNER JOIN #nodesC parent ON child.ParentId = parent.id 
     WHERE child.ID NOT IN (SELECT id FROM #nodesC) 

    DELETE 
    FROM Comments 
    WHERE ID IN (SELECT id FROM #nodesC) 

END 
+0

vous le feriez exactement de la même manière? –

+0

@Mitch Wheat, que voulez-vous dire? – markiz

Répondre

0

Vous ne pouvez pas passer un tableau en tant que paramètre directement. Alors:

  • Pass en XML et analyser dans 2 proc stocké
  • Utilisez le tableau type de données (SQL Server 2008)
  • appels multiples à 2 proc stocké par ID en XML analysé (mauvais, ici pour être complet)

Dans le cas contraire, l'article faisant autorité sur la façon dont ne traiter cette question est Arrays and Lists in SQL Server 2005 par Erland Sommarskog

+0

oui, je veux appeler plusieurs fois 2ème proc stocké par ID en XML analysé, pourquoi c'est mauvais? – markiz

+0

c'est une boucle procédurale! – gbn

+0

OUI, je suppose que je dois utiliser une boucle dans mon scénario ... – markiz

0

Vous aurez besoin d'un curseur.

DECLARE c CURSOR LOCAL FORWARD_ONLY FOR SELECT ... FROM OPENXML(...) WITH(...) 
OPEN c 
WHILE 1 <> 0 BEGIN 
    FETCH c INTO ... 
    IF @@fetchstatus <> 0 BREAK 
    EXEC ... 
END 
CLOSE c 
DEALLOCATE c 
Questions connexes