我正在尝试使用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>
转到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
答案 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