2010-08-12 38 views
0

我正在使用CTE来递归存储在递归表中的数据。麻烦的是我想弄清楚如何使用“FOR XML”来构建所需的xml输出。我有一个目录表我正在递归,我希望能够使用该数据来生成XML。构建关闭公用表表达式的XML

这里是什么样的数据是simliar一个例子:我希望能够吐出数据,像这样

ID|TOC_ID|TOC_SECTION|TOC_DESCRIPTON|PARENT_ID 
1|I|Chapter|My Test Chapter|-1 
2|A|Section|My Test Section|1 
3|1|SubSection|My SubSection|2 

XML属性:从 ID =追加值TOC_ID场 值=从TOC_Section字段值

<FilterData> 
    <Filter id="I" value="Chapter"> 
    <Description>My Test Chapter</Description> 
     <Filter id="I_A" value="Section"> 
     <Description>My Test Section</Description> 
      <Filter id="I_A_1" value="SubSection"> 
      <Description>My Test SubSection</Description> 
      </Filter> 
     </Filter> 
    </Filter> 
</FilterData> 

不知道我怎么可以把CTE数据并产生类似的格式 以上。当数据位于不同的表中时,构建这种类型的输出并不困难。

一如既往的欣赏输入。

感谢,

小号

+0

是否有一个最大深度的3个级别的数据? – 2010-08-12 05:46:23

+0

嗨戴夫, 这就是问题...现实我看不到它会超过3或4,但你永远不会知道 – scarpacci 2010-08-12 05:50:40

回答

0

检查了一下Will(不知道你还在继续)....这确实有一个32级的最大值,但是这对我的东西应该仍然可以正常工作......看不到更深入的。在另一个论坛上发现这个:

CREATE TABLE tree (id INT, name VARCHAR(5), parent_id INT) 

GO 

INSERT INTO tree VALUES (1, 'N1', NULL) 

INSERT INTO tree VALUES (3, 'N4', 1) 

INSERT INTO tree VALUES (4, 'N10', 3) 

INSERT INTO tree VALUES (5, 'N7', 3) 

GO 



CREATE FUNCTION dbo.treeList(@parent_id int) 

RETURNS XML 

WITH RETURNS NULL ON NULL INPUT 

BEGIN RETURN 

(SELECT id as "@id", name as "@name", 

CASE WHEN [email protected]_id 

THEN dbo.treeList(id) 

END 

FROM dbo.tree WHERE [email protected]_id 

FOR XML PATH('tree'), TYPE) 

END 

GO 



SELECT id AS "@id", name AS "@name", 

CASE WHEN id=1 

THEN dbo.treeList(id) 

END 

FROM tree 

WHERE id=1 

FOR XML PATH('tree'), TYPE 

现在不是那么好,简单吗?

从很好的例子,在定制上http://msdn.microsoft.com/en-us/library/ms345137.aspx

1

您可以在基督教韦德的博客得到一些行驶距离从Recursive Hierarchies to XML - 这一切看起来威猛痛彻心扉!

+0

我会看看谢谢你将是 – scarpacci 2010-08-12 05:51:11

+0

你是对的那样会是丑陋....我真的想避免写一个CLR程序......但我可能不得不这样做。 – scarpacci 2010-08-12 05:57:18

+0

我会尝试尽可能远离SQL Server进行这种转换,如果您有选择在代码中执行此操作(在客户端应用程序中),那么我认为您会发现更简单。 – 2010-08-12 06:04:22