就业数据资源平台
当前位置:首页 > 数据库技术
数据库: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 为可选输入参数,可以是下列值之一。
就业数据资源平台