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 表示法定義 "字段-元素"關聯。