最近在项目中用到了SQL Server中的XML格式化,以下作了简单的总结。
以下使用PE_C_PersonnelArea这个表来进行展示
一般我们将表中数据输出到XML,如果没有结构要求的话可以简单地使用 FOR XML AUTO
SELECT * FROM PE_C_PersonnelArea FOR XML AUTO
我们点击得到的结果就可以看到经过格式化的XML
--还有一个简单的方法就是使用 FOR XML RAW
SELECT * FROM PE_C_PersonnelArea FOR XML RAW
输出的是每行以row为节点,每列为同名的节点属性的XML
我们可以通过给RAW添加参数改变节点名
SELECT * FROM PE_C_PersonnelArea FOR XML RAW('Areas')
或者给列添加一个别名来改变节点属性名
SELECT PersonnelAreaID 'ID',PersonnelArea 'Name' FROM PE_C_PersonnelArea FOR XML RAW('Areas')
以上是两个方法都是较为简单得把表格式化为XML,但有时候需求会更加复杂,而简单地改变节点名和属性名是满足不了要求的。
而接下来要讲的方法就是更好得自定义XML的格式。
使用FOR XML PATH,ROOT格式化XML
SELECT * FROM PE_C_PersonnelArea FOR XML PATH
通过给PATH添加参数改变节点名,如果传入空值('')将去掉节点
SELECT * FROM PE_C_PersonnelArea FOR XML PATH('Areas')
SELECT * FROM PE_C_PersonnelArea FOR XML PATH('')
我们同样可以指定属性名
SELECT PersonnelAreaID '@ID',PersonnelArea '@Name' FROM PE_C_PersonnelArea FOR XML PATH('Area')
因为使用这种方法是需要按照XPath来格式化XML的,所以属性是需要加上@的哦,如果没有加上的话就会变成Area的子节点了。
SELECT PersonnelAreaID 'ID',PersonnelArea 'Name' FROM PE_C_PersonnelArea FOR XML PATH('Area')
按照XPath,我们其实可以改写成以下的样子,结果是一样的
SELECT PersonnelAreaID 'Area/@ID',PersonnelArea 'Area/@Name' FROM PE_C_PersonnelArea FOR XML PATH('')
对了,大家有没有发现一只到现在我们看到输出的XML少了根节点?我们需要在上面的基础上添加ROOT,操作如下
SELECT PersonnelAreaID '@ID',PersonnelArea '@Name' FROM PE_C_PersonnelArea FOR XML PATH('Area'),ROOT('Areas')
FOR XML PATH除了输出XML之外,还有很有意思的用法。
例如输出特殊格式
SELECT '地区分类',(SELECT '[' + PersonnelArea + ']' FROM PE_C_PersonnelArea FOR XML PATH(''))