2009-10-21 182 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 
相关问题