数据库:Sql提供了对XML的强大支持
这里主要讲两点:
1、将select 的结果转换成Xml
FOR XML RAW 这会将结果集中每一行数据作为单个数据元素回传。元素名称为row,每行的数据项作为row的属性。
FOR XML AUTO 这个选项会把用表名或数据源名标记每一个数据元素。
FOR XML EXPLICIT 可以定义返回数据的层次结构,使其中每个片断都属于特定的层次,然后进行格式化的查询。
更改显示Tag为中文
同表 多层
异表 多层
处理数据及日期等的Null值
除此之外Fox XML 还可以用于赋值语句
==================
数据库Person表中的数据为
personName personAge
lisi 30
zhangsan 30
----------[ RAW ]---------
SELECT [personName], [personAge]
FROM [TestDB].[dbo].[person]
FOR XML RAW
结果:
row personName="lisi " personAge="30"/
row personName="zhangsan " personAge="30"/
----------[ AUTO ]--------
SELECT [personName], [personAge]
FROM [TestDB].[dbo].[person]
FOR XML AUTO
结果:
TestDB.dbo.person personName="lisi " personAge="30"/
TestDB.dbo.person personName="zhangsan " personAge="30"/
-----------[ EXPLICIT ]--------
select 1 as Tag ,null as parent
,RTRIM as [PersonBasic!1!personName]
,RTRIM as [PersonBasic!1!personAge!xml]
FROM [TestDB].[dbo].[person]
FOR XML EXPLICIT
结果:
PersonBasic personName="lisi"
personAge30/personAge
/PersonBasic
PersonBasic personName="zhangsan"
personAge30/personAge
/PersonBasic
path能够更加灵活的控制层次。
----- 更改显示Tag为中文 -----
select
1 as tag,
null as parent,
personName as [人员!1!姓名!xml],
personAge as [人员!1!年龄!xml]
from person
for xml EXPLICIT
结果:
人员
姓名lisi /姓名
年龄30/年龄
/人员
人员
姓名zhangsan /姓名
年龄30/年龄
/人员
----- 同表 多层 ----
select
1 as tag,
null as parent,
rtrim as [人员!1!姓名],
null as [人员!2!年龄!xml]
from person A
union all
select
2 as tag,
1 as parent,
rtrim,
B.personAge
from person B,person A
where A.personName=B.personName
order by [人员!1!姓名],tag
for xml EXPLICIT
结果:
人员 姓名="lisi"
人员
年龄30/年龄
/人员
/人员
人员 姓名="zhangsan"
人员
年龄30/年龄
/人员
/人员
-------- 异表 多层 -------
select
1 as tag,
null as parent,
rtrim as [人员!1!姓名],
null as [人员!2!年龄!xml],
null as [人员!2!职业!xml]
from person A
union all
select
2 as tag,
1 as parent,
rtrim,
B.personAge,
rtrim
from personInfo B,person A
where B.personName=A.personName
order by [人员!1!姓名],tag
for xml EXPLICIT
结果:
人员 姓名="lisi"
人员
年龄30/年龄
职业teacher/职业
/人员
/人员
人员 姓名="zhangsan"
人员
年龄30/年龄
职业worker/职业
/人员
/人员
-------处理数据及日期等的Null值-------
数据库Person表中的数据为
personName personAge personBirth
lisi 30 1987-06-06
zhangsan 30
当数据表中的字段为Null值时
产生的xml文档中 将没有该节点
为了解决这一问题
在必要的时候 可以将数字及日期类型
转换为字符串类型
这样就可以接收空串
SELECT
1 as TAG,
null as parent,
RTRIM AS [人员!1!姓名!xml],
RTRIM,’’)) AS [人员!1!年龄!xml],
RTRIM,personBirth,120),’’)) AS [人员!1!出生日期!xml]
FROM person
FOR XML EXPLICIT
结果:
人员
姓名lisi/姓名
年龄30/年龄
出生日期1987-06-06/出生日期
/人员
人员
姓名zhangsan/姓名
年龄/年龄
出生日期/出生日期
/人员
除此之外Fox XML 还可以用于赋值语句
DECLARE @x xml
SET @x =
SELECT @x
2、从xml中查寻 OpenXml
OPENXML 通过 XML 文档提供行集视图。由于OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表、视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML。
语法
OPENXML
[WITH ]
参数
idoc
是 XML 文档的内部表式法的文档句柄。通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式法。
rowpattern
是 XPath 模式,用来标识要作为行处理的节点(这些节点在 XML 文档中,该文档的句柄由 idoc 参数传递)。
flags
表示应在 XML 数据和关系行集间使用映射以及应如何填充溢出列。flag 为可选输入参数,可以是下列值之一。