在SQL Server中生成嵌套XML

时间:2014-04-10 23:57:56

标签: sql-server xml

我正在尝试使用FOR XML语法获取一个表数据库并使用Azure SQL数据库生成嵌套XML。

我的表格看起来像这样

任务表

NAME    | ID | PARENT
School  |  0 | NULL
Math    |  1 |    0
CSC     |  2 |    0
Eng     |  3 |    0
HW      |  4 |    1
Quiz    |  5 |    1
HW      |  6 |    2
Quiz    |  7 |    2
HW      |  8 |    3
Quiz    |  9 |    3
Hw1     | 10 |    4
Hw2     | 11 |    4

这就是我希望XML像

一样出现的
<Task name=School>  
   <Task name=Math>  
      <Task name=HW>  
         <Task name=Hw1>  
         <Task name=Hw2>  
      <Task name=Quiz>  
   <Task name=CSC>  
      <Task name=HW>  
      <Task name=Quiz>  
   <Task name=Eng>  
      <Task name=HW>  
      <Task name=Quiz>  
<\Task>  

-


来自@Mikael Eriksson的解决方案

转到www.SQLFiddle.com,在左上角选择SQL Server 2012。

在左侧的Schema面板中输入以下内容,然后在#Build; Build Schema&#39;

create table dbo.Task
(
  Name varchar(10),
  ID int,
  Parent int
);

insert into Task values
('School'  ,  0 , null),
('Math'    ,  1 ,    0),
('CSC'     ,  2 ,    0),
('Eng'     ,  3 ,    0),
('HW'      ,  4 ,    1),
('Quiz'    ,  5 ,    1),
('HW'      ,  6 ,    2),
('Quiz'    ,  7 ,    2),
('HW'      ,  8 ,    3),
('Quiz'    ,  9 ,    3),
('Hw1'     , 10 ,    4),
('Hw2'     , 11 ,    4);

go

create function dbo.GetTaskXML(@ParentID int) returns xml
as
begin
  return (
         select Name as [@name],
                (select dbo.GetTaskXML(ID))
         from dbo.Task
         where Parent = @ParentID or 
               (Parent is null and @ParentID is null)
         for xml path('Task'), type
         )
end

请务必点击“构建架构”,构建架构后,您可以在右侧窗口中输入查询。

select dbo.GetTaskXML(null)  

现在运行查询,底部窗口将返回XML结果,再次感谢Mikael

1 个答案:

答案 0 :(得分:2)

如果您的层次结构不超过32个级别,则可以使用构建XML的递归标量值函数。

create function dbo.GetTaskXML(@ParentID int) returns xml
as
begin
  return (
         select Name as [@name],
                (select dbo.GetTaskXML(ID))
         from dbo.Task
         where Parent = @ParentID or 
               (Parent is null and @ParentID is null)
         for xml path('Task'), type
         )
end

SQL Fiddle