构建公用表表达式的XML

时间:2010-08-12 05:26:17

标签: sql tsql sql-server-2008

我正在使用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数据并生成与上述类似的格式。当数据在单独的表中时,构建这种类型的输出并不困难。

一如既往地欣赏输入。

谢谢,

取值

2 个答案:

答案 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

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

根据http://msdn.microsoft.com/en-us/library/ms345137.aspx

上的优秀示例进行自定义