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 文档的过程分三步。
- 使用存储过程 sp_xml_preparedocument,通过把 XML 文档编译成内部 DOM 表示来获取一个 XML 文档句柄。
- 通过对模式字段关联上原子 XML 元素来构造一个模式。 通过路径 pattern(绝对基础路径)加上相对元素路径来定义 XML 元素。通过标志值 2 指示以元素为中心的映射。可以使用现存的表替代一个模式,带有等价于 XML 名字的字段名字。
- 使用存储过程 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 表示法定义 "字段-元素"关联。