2009-10-21 166 views
0

這是根據傳遞給它的XML參數數組刪除行,我的存儲過程:調用存儲過程並傳遞參數從另一個存儲過程

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 

現在不是DELETE我要打電話到另一個存儲過程(執行分級刪除,它接收ID參數)

我該怎麼做?

UPDATE:這是我的第二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

你會以完全相同的方式做到這一點? – 2009-10-21 09:53:39

+0

@米奇小麥,你是什麼意思? – markiz 2009-10-21 09:56:48

回答

0

不能直接傳遞數組作爲參數。所以:

  • 通行證在XML和解析在第二存儲過程
  • 使用表的數據類型(SQL Server 2008中)
  • 多次調用在解析的XML每個ID第二個存儲過程(壞,是爲了完整性)

否則,你怎麼處理這個權威文章是由Arrays and Lists in SQL Server 2005厄蘭Sommarskog

+0

是的,我想調用多次解析XML中的每個ID的第二個存儲過程,爲什麼它不好? – markiz 2009-10-21 10:10:48

+0

這是一個程序循環! – gbn 2009-10-21 10:43:21

+0

是的,我想我需要在我的場景中使用循環... – markiz 2009-10-21 11:11:45

0

您需要的光標。

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 
相關問題