SQL 到 XML 的映射


SQL Server 的 SQL-to-XML 和 XML-to-SQL 映射规则使用不同的语法。在下面的提取和存储段落中讨论映射的详情。



从数据库提取 XML


在数据库列和 XML 元素或属性之间的映射通过在 SELECT 中的 AS 别名的方式来定义:



    <数据库列> AS [元素名字! 嵌套级别! 属性名字! 指示]



同下面一样,文档顶层被赋予级别 1。缺省的,映射列数据在属性值上。可以使用指示"element"来改变这个缺省设置。



从数据库生成 XML 的过程有两步。



步骤 1。建立到你希望输出 XML 中的原子元素的 As-别名;别名定义了在元素之间的父/子联系。下面的表展示给我们的例子文档的别名。



FXTRADE       /* LEVEL=1 */
     CURRENCY1   [FXTRADE!1!CURRENCY1]
     CURRENCY2   [FXTRADE!1!CURRENCY2]
     AMOUNT      [FXTRADE!1!AMOUNT]
     SETTLEMENT  [FXTRADE!1!SETTLEMENT]
     ACCOUNT   /* LEVEL=2  */
         BANKCODE     [ACCOUNT!2!BANKCODE]
         BANKACCT     [ACCOUNT!2!BANKACCT]



步骤 2。在 SQL 中定义输出树结构。通过 SELECT 语句定义树的每个级别,此后通过 UNION ALL 语句的手段把各个级别组合在一起到树中。级别-1 SELECT 语句介入在所有级别上的原子元素名字。每个 SELECT 语句介入一个树级别标记和它的父标记。在结果集中有一个单一记录对应于树根,如同在下面的第一个 SELECT 语句中定义的那样。



SELECT
     1          AS    Tag,
     NULL       AS    Parent,
     NULL       AS    [FXTRADE!1!CURRENCY1],
     NULL       AS    [FXTRADE!1!CURRENCY2],
     NULL       AS    [FXTRADE!1!AMOUNT],
     NULL       AS    [FXTRADE!1!SETTLEMENT],
     NULL       AS    [ACCOUNT!2!BANKCODE],
     NULL       AS    [ACCOUNT!2!BANKACCT]
 FROM
     FXTRADE
 UNION ALL
 SELECT
     2,
     1,
     FXTRADE.CURRENCY1,
     FXTRADE.CURRENCY2,
     FXTRADE.AMOUNT,
     FXTRADE.SETTLEMENT,
     ACCOUNT.BANKCODE,
     ACCOUNT.BANKACCT
 FROM
     FXTRADE,    ACCOUNT
 WHERE
     FXTRADE.ACCOUNT = ACCOUNT.ID
 ORDER    BY    [ACCOUNT!2!BANKCODE],
         [ACCOUNT!2!BANKACCT]
 FOR    XML    EXPLICIT, ELEMENTS



FOR XML 通过分析在组合的行集中的标记和AS-别名构造 XML 文档。关键字 EXPLICIT 选择构造 XML 文档的最灵活的、用户定义的模式。另一个模式 AUTO 通过应用缺省规则构造 XML 文档。关键字 ELEMENTS 在元素级别建模 SQL 列;否则,缺省的是在属性级别建模 SQL 列。



存储 XML 在数据库中


使用 OPENXML 存储 XML 文档,它是一个新的行集函数,类似于表或视图。可以使用 OPENXML 来插入或更新或 SELECT INTO 目标表。OPENXML 简化的语法展示如下:



OPENXML    (<XML 文档句柄>, <路径 pattern>, <标志>)


WITH     (模式 | 表)


存储 XML 文档的过程分三步。


  1. 使用存储过程 sp_xml_preparedocument,通过把 XML  文档编译成内部 DOM 表示来获取一个 XML 文档句柄。
  2. 通过对模式字段关联上原子 XML 元素来构造一个模式。    通过路径 pattern(绝对基础路径)加上相对元素路径来定义 XML 元素。通过标志值 2 指示以元素为中心的映射。可以使用现存的表替代一个模式,带有等价于 XML 名字的字段名字。
  3. 使用存储过程 sp_xml_removedocument 从内存中删除编译过的 XML 文档。



在下列例子中展示这些步骤。



DECLARE @idoc int
 DECLARE @doc varchar(1000)
 SET @doc ='
 <FXTRADE>
     <CURRENCY1>GBP</CURRENCY1>
     <CURRENCY2>JPY</CURRENCY2>
     <AMOUNT>10000</AMOUNT>
     <SETTLEMENT>20010325</SETTLEMENT>
     <ACCOUNT>
         <BANKCODE>812</BANKCODE>
         <BANKACCT>00365888</BANKACCT>
     </ACCOUNT>
 </FXTRADE>'
 -- 建立 XML 文档的内部 DOM 表示。
 EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
 -- 执行使用 OPENXML 行集提供者的一个 SELECT 语句。
 SELECT *
 FROM OPENXML (@idoc, '/FXTRADE/ACCOUNT', 2)
 WITH (
   CURRENCY1     CHAR (3),       '../@CURRENCY1',
   CURRENCY2     CHAR (3),       '../@CURRENCY2',
   AMOUNT        NUMERIC (18,2), '../@AMOUNT',
   SETTLEMENT    DATETIME,       '../@SETTLEMENT',
   BANKCODE      VARCHAR (100),  '@BANKCODE',
   BANKACCT      VARCHAR (100),  '@BANKACCT' )
 EXEC sp_xml_removedocument @idoc



总结


对于 Microsoft SQL Server 2000,XML 文档的提取和存档不使用对称的语法。提取通过使用 FOR XML 构造扩展出一个 SELECT-子句。存储介入一个行集函数 OPENXML,类比于一个表或视图。提取映射规则是基于 (a)介入指定树级别用的标记和 (b) 对表的字段关联上在 XML 文档元素之间的父/子联系。存储把 XML 文档重构到一个平坦的模式或表中;使用 XPath 表示法定义 "字段-元素"关联。