FOR XML PATH

FOR XML PATH 详解

FOR XML PATH 可以将查询结果根据行输出成 XML 格式。先看看我们的表结构和数据。

使用 FOR XML PATH:

SELECT [学号]
      ,[姓名]
      ,[性别]
      ,[出生日期]
      ,[民族]
      ,[所属班级]
      ,[家庭住址]
  FROM [学生成绩管理系统].[dbo].[学生信息] FOR XML PATH 
GOCode language: CSS (css)

我们可以看到 for xml path 其实就是把每一条记录转换成 xml 的格式输出,每一行的标签使用 row,每一个属性使用列名:

<row>
  <学号>2005010101</学号>
  <姓名>苏俊丹       </姓名>
  <性别>女         </性别>
  <出生日期>1987-01-12</出生日期>
  <民族>汉族        </民族>
  <所属班级>20050101  </所属班级>
  <家庭住址>河南商丘</家庭住址>
</row>
<row>
  <学号>2005010102</学号>
  <姓名>张苗苗       </姓名>
  <性别>女         </性别>
  <出生日期>1985-05-15</出生日期>
  <民族>汉族        </民族>
  <所属班级>20050101  </所属班级>
  <家庭住址>河南洛阳</家庭住址>
</row>Code language: HTML, XML (xml)

可以改变这个 row 的名称:

SELECT [学号]
      ,[姓名]
      ,[性别]
      ,[出生日期]
      ,[民族]
      ,[所属班级]
      ,[家庭住址]
  FROM [学生成绩管理系统].[dbo].[学生信息] FOR XML PATH('行') 
GOCode language: JavaScript (javascript)
<行>
  <学号>2005010101</学号>
  <姓名>苏俊丹       </姓名>
  <性别>女         </性别>
  <出生日期>1987-01-12</出生日期>
  <民族>汉族        </民族>
  <所属班级>20050101  </所属班级>
  <家庭住址>河南商丘</家庭住址>
</行>
<行>
  <学号>2005010102</学号>
  <姓名>张苗苗       </姓名>
  <性别>女         </性别>
  <出生日期>1985-05-15</出生日期>
  <民族>汉族        </民族>
  <所属班级>20050101  </所属班级>
  <家庭住址>河南洛阳</家庭住址>
</行>Code language: HTML, XML (xml)

如果传入空字符,则输出:

<学号>2005010101</学号>
<姓名>苏俊丹       </姓名>
<性别>女         </性别>
<出生日期>1987-01-12</出生日期>
<民族>汉族        </民族>
<所属班级>20050101  </所属班级>
<家庭住址>河南商丘</家庭住址>
<学号>2005010102</学号>
<姓名>张苗苗       </姓名>
<性别>女         </性别>
<出生日期>1985-05-15</出生日期>
<民族>汉族        </民族>
<所属班级>20050101  </所属班级>
<家庭住址>河南洛阳</家庭住址>Code language: HTML, XML (xml)

也可以通过使用 as 对字段名进行转义,这样标签名也会变:

SELECT [学号] as number
      ,[姓名] as name
      ,[性别] as sex
  FROM [学生成绩管理系统].[dbo].[学生信息] FOR XML PATH('myrow') 
GOCode language: JavaScript (javascript)
<myrow>
  <number>2005010101</number>
  <name>苏俊丹       </name>
  <sex>女         </sex>
</myrow>
<myrow>
  <number>2005010102</number>
  <name>张苗苗       </name>
  <sex>女         </sex>
</myrow>Code language: HTML, XML (xml)

另外,也可以使用 + 号来改变格式:

SELECT '['+[学号]+']' 
  FROM [学生成绩管理系统].[dbo].[学生信息] FOR XML PATH('myrow') 
GOCode language: JavaScript (javascript)
<myrow>[2005010101]</myrow>
<myrow>[2005010102]</myrow>
<myrow>[2005010201]</myrow>
<myrow>[2005010202]</myrow>
<myrow>[2005020101]</myrow>
<myrow>[2005020102]</myrow>
<myrow>[2005020201]</myrow>
<myrow>[2005020202]</myrow>
<myrow>[2005030101]</myrow>
<myrow>[2005030102]</myrow>
<myrow>[2005040101]</myrow>
<myrow>[2005040102]</myrow>
<myrow>[2005040201]</myrow>
<myrow>[2005040202]</myrow>
<myrow>[2005050101]</myrow>
<myrow>[2005050102]</myrow>
<myrow>[2005050201]</myrow>
<myrow>[2005050202]</myrow>Code language: HTML, XML (xml)

甚至可以这样:

SELECT '['+[学号]+']' 
  FROM [学生成绩管理系统].[dbo].[学生信息] FOR XML PATH('') 
GOCode language: JavaScript (javascript)
[2005010101][2005010102][2005010201][2005010202]
[2005020101][2005020102][2005020201][2005020202]
[2005030101][2005030102][2005040101][2005040102]
[2005040201][2005040202][2005050101]
[2005050102][2005050201][2005050202]Code language: JSON / JSON with Comments (json)

应用示例

select 
c.学生编号,
(
	SELECT ','+ ltrim(rtrim(Convert(nvarchar(30),分数))) 
	FROM [dbo].[成绩信息] c2
	WHERE c2.学生编号 = c.学生编号 
	FOR XML PATH('')
) as  分数情况
from [dbo].[成绩信息] as c
group by c.学生编号Code language: JavaScript (javascript)
Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注