我正在使用CTE来递归我存储在递归表中的数据。问题是我试图找出如何使用“FOR XML”来构建所需的xml输出。我有一个目录表我正在递归,我希望能够使用该数据生成XML。
以下是数据与之相似的示例:
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字段的附加值 value =来自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 :(得分:1)
你可能会在Christian Wade的博客中从Recursive Hierarchies to XML获得一些里程 - 这一切对我来说都很痛苦!
答案 1 :(得分: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 parent_id=@parent_id
THEN dbo.treeList(id)
END
FROM dbo.tree WHERE parent_id=@parent_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
现在不是那么好又简单吗?
上的优秀示例进行自定义