淺探SQL Server 2005對XML的支持

1.    引言

可擴展標記語言 (XML) 作爲一種與平臺無關的數據表示形式已被廣泛採用。它對於在鬆散耦合且完全不同的系統,以及各種企業到企業 (B2B) 應用和工作流範疇內交換信息是很有用的。數據交換已成爲 XML 技術的主要驅動力之一。

經過長時間的發展和改進,關係數據庫在數據安全性、併發性控制、數據共享、數據傳輸、數據備份和恢復方面已經相當的成熟,關係數據庫將爲XML數據存儲的數據管理、查詢和修改處理等方面提供強有力支持;同時,我們可以利用關係數據庫的索引功能爲XML數據建立索引,從而優化XML數據的查詢。

XML數據可以方便地與現有的關係數據和SQL應用程序互操作,這樣我們可以在不破壞原有應用程序的前提下進行數據建模,爲系統引入XML;數據庫的服務器還爲XML數據提供了備份、恢復和複製等管理功能。

2.    XML的方式獲取信息

XML的支持的首要一點就是允許用戶直接從數據庫中取出,並以XML的方式顯示出來。爲此,需要爲SELETE語句配置一個FOR XML子句,其語法如下:

[ FOR { XML { RAW | AUTO | EXPLICIT }

[ , XMLDATA ]

[ , ELEMENTS ]

[ , BINARY BASE64 ] } ]

 

 

 

 

 

 

 

 

 

 

 

 


FOR XML子句的XML有三種模式:RAWAUTO或者EXPLICIT,選擇的模式決定了結果XML文件的形式和組成。

RAW 模式將查詢結果的每一行以一個帶有類屬標識符 row  XML 元素顯示出來,SELECT語句中的列作爲元素屬性。

AUTO模式是默認模式,此時返回的查詢結果以簡單的XML樹顯示。結果集中元素的嵌套或者層次由 SELECT 語句中指定列所標識的表順序決定。最左邊的表將成爲最頂層元素,次左邊的表(由 SELECT 語句中的列標識)將嵌套在頂層元素內,依次類推。

EXPLICIT 模式下,查詢編程人員可以顯式地定義結果 XML 樹的形狀。使用該模式要求以特殊方式書寫查詢,有關所需嵌套的附加信息也作爲查詢的一部分顯式指定。

FOR XML還有另外三個可選項:XMLDATABINARY base64ELEMENTS

XMLDATA:指定該選項時,XML文檔架構將包含在XML文檔中顯示出來。

ELEMENTS:如果指定了該選項,列將以子元素形式返回,否則,列將被映射爲 XML 屬性。該選項只支持在 AUTO 模式下使用。

BINARY base64:在查詢中指定該選項可以返回 base64 編碼格式的二進制數據。在 RAW EXPLICIT 模式下,不指定該選項檢索二進制數據的結果是產生錯誤。

可以使用在URL處的執行SQL 語句、XML模板進行查詢、HTML事件集成等方式完成上述查詢。下面舉幾個簡單的例子。


ROW模式:

AUTO模式:


指定ELEMENTS項:

3.    XML數據的存儲

SQL Server 2005用戶可以用普通的CREATE TABLE語句創建帶有XML列的表,然後就可以通過多種方式存儲XML數據。

非類型化的XML數據類型

XML數據的架構爲未知;或架構爲已知,但映射到關係數據模型非常複雜並且難於維護等情況,可以使用非類型化的XML數據類型。非類型化的XML允許存儲XML內容片段。例:

CREATE TABLE student (number INT PRIMARY KEY, xCol XML not null)

 

 

 


類型化的XML數據類型

XML數據的架構爲已知時可以使用類型化的XML數據類型。使用類型化的XML有利於對數據的有效性驗證以及存儲和查詢的優化處理。對於類型化的XML,使用 DOCUMENT(不允許片段)或 CONTENT(允許片段)規範指定是否允許存儲內容片段,同時必須提供XML的架構集合。例:

CREATE TABLE student(

number INT PRIMARY KEY,

doc XML(CONTENT con))

 

 

 

 

 

 

 

 

 


使用約束

可以在類型化和非類型化的 XML 數據類型的列中使用關係約束,除主鍵和外鍵約束外大部分SQL 約束同樣可應用於 XML 列。

XML數據的存儲

1.      直接把數據插入到XML列中,在插入過程中會進行格式良好性檢查,同時對於類型化的XML,必須聲明XML架構的命名空間。

2.      將來自文件的數據插入非類型化的 XML 列。

3.      存儲有 TYPE 指令的 FOR XML 生成的 XML 數據。

4.    XML數據的查詢和修改

Xquery語言

Xquery語言是一種巧妙地使用 XML 結構的查詢語言,可以跨各種數據表示查詢,而不管這些數據是物理存儲在 XML 中,還是通過中間件被視爲 XML

XQuery 語言之於 XML 正如 SQL 語言之於關係數據庫。它是使得查詢簡潔易懂,而又相當靈活,可以查詢大範圍的 XML 信息源,其中包括數據庫和文檔。

XML數據類型的五種操作方法

XML數據類型提供了四個檢索XML值或實例的方法:query()value()exist() nodes(),以及修改XML數據的modify() 方法。

query() 方法用於提取 XML 實例的部分。XQuery 表達式求值爲一個 XML 節點列表。以這些節點中的每一個爲根的子樹按照文檔順序返回。結果類型爲非類型化的XML

SELECT number, doc.query('/doc[@id = 503]//section')  
FROM   student

 

 

 

 

 

 


value() 方法從 XML 實例提取標量值。它返回 XQuery 表達式所求值的節點的值。該值被轉換爲 value() 方法的第二個參數所指定的 T-SQL 類型。例:

SELECT doc.value( 'data((/doc//section[@num = 3]/heading)[1])', 'nvarchar(max)')

FROM student

 

 

 

 

 

 


exist() 方法用於對 XML 實例進行存在性檢查。如果 XQuery 表達式求值爲非空節點列表,則返回 1;否則,返回 0

nodes() 方法產生特定 XML 數據類型的實例,每個實例都將其上下文設置爲 XQuery 表達式所求值的不同節點。特定的 XML 數據類型支持 query()value() nodes() exist() 方法,並且可以用於 count(*) 聚合和 NULL 檢查。所有其他的使用都會產生錯誤。

modify() 方法允許修改 XML 實例的某些部分,例如添加或刪除子樹,或者更新標量值。例:

UPDATE student SET doc.modify('

replace value of (/doc[@number="1458"]/last-name)[1] with "wang"')

 

 

 

 

 

 


5.    創建XML索引

XML 數據是以內部二進制形式存儲的,其存儲容量可達到2GB。對於XML數據的查詢在運行時可能需要一次或多次地解析表中每一行的XML BLOB,這會使查詢處理的速度變得很慢。如果在工作負荷中常常需要進行查詢,可以爲XML列建立索引,提高查詢的處理速度。

SQL Server 2005中,XML索引包括主XML索引、次XML索引和內容索引。

XML索引

XML索引可以通過CREATE PRIMARY XML INDEX語句創建,它在 XML 節點的信息集項的一個子集中創建一個B+樹。B+樹的列表示標記,例如元素和屬性名稱、節點值和節點類型。其他的列捕獲XML數據中的文檔順序和結構,以及從XML實例的根節點到每個節點的路徑,從而有效地對路徑表達式進行求值。基表的主鍵在主XML索引中複製,以使索引行與基錶行相關。例:

CREATE PRIMARY XML INDEX index_doc on student (doc)

 

 

 


需要 XML 數據類型方法的查詢使用主 XML 索引,從索引本身返回標量值或 XML 子樹。如:從 XML 列檢索的(SELECT * FROM student SELECT doc FROM student)。

XML索引

在主XML索引的基礎上,可以創建次索引來加速不同類型的查詢處理。SQL Server 2005提供了三種次XML索引分別爲不同類型的查詢服務:

PATH索引加速基於路徑的查詢,PATH索引在主XML索引的列(path, value)中構建 B+ 樹。利用PATH索引提高查詢速度的常見例子爲:SELECT語句的WHERE子句中對XML列使用exist()方法。例:

CREATE XML INDEX index_doc_Path on student (doc)
   USING XML INDEX index_doc FOR PATH

 

 

 

 

 

 


PROPERTY索引有利自定義屬性管理方案,索引在主 XML 索引的列 (PK, path, value) 中創建 B+ 樹。PROPERTY索引對 XML 實例中的屬性值查找有利。例:

CREATE XML INDEX index_doc_Property on student (doc)
   USING XML INDEX index_doc FOR PROPERTY

 

 

 

 

 

 

 

 

 


VALUE索引加速基於值的查詢,VALUE索引對節點的值已知,但是其路徑沒有準確指定的查詢有利。例:

CREATE XML INDEX index_doc_Value on docs (doc)
   USING XML INDEX index_doc FOR VALUE

 

 

 

 

 

 


內容索引

可以爲XML列創建全文本索引,此時XML標記會因爲全文本索引的建立而被忽略。查詢時可以把全文本索引和XML索引組合起來使用,首先利用全文本索引作爲篩選器來縮小查詢範圍,再利用XML索引進行查詢。

6.    結論

本文從以XML方式獲取信息、XML數據的存儲、XML數據的查詢和修改以及XML索引的創建等方面對SQL Server 2005XML的支持進行了簡要的討論。我們看到SQL Server 2005已經爲XML數據提供了強有力的支持,在業已發展成熟的關係數據庫這個溫牀上,XML技術將在未來發揮更大的影響。

發佈了23 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章