SQL 到 XML 的映射

 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 表示法定義 "字段-元素"關聯。
發佈了40 篇原創文章 · 獲贊 8 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章