SQL Server 2008中有關XML的新功能-Mssql資料庫教程

iSQlServer發表於2010-03-17
1 導言

Microsoft 在Microsoft SQL Server 2000中推出了與XML相關的功能以及Transact-SQL 關鍵字FOR XML和OPENXML ,這使得開發人員可以編寫Transact-SQL程式碼來獲取XML流形式的查詢結果,並將一個XML文件分割成一個rowset。SQL Server 2005顯著的擴充套件了這些XML功能,推出了一個支援XSD schema驗證、基於XQuery的操作和XML索引的本地的xml 資料型別。SQL Server 2008建立在之前版本的XML功能基礎之上,做了改進來迎接客戶在儲存和操縱資料庫中的XML資料時所面臨的挑戰。

2 SQL Server XML 功能的發展歷程

SQL Server的XML功能隨著從SQL Server2000版本以來的每一個版本而不斷髮展。在我們檢查SQL Server 2008中的改進之前,通過之前的版本來總結XML功能的發展歷程可能會比較有用。

2.1 SQL Server 2000中的XML功能

在SQL Server 2000中,Microsoft 推出了Transact-SQL 關鍵字FOR XML和OPENXML。FOR XML 是對SELECT語句的擴充套件,它返回如下面的示例所示的XML流式的查詢結果。

  SELECTProductID,ProductName
  FROMProductsProduct
  FORXMLAUTO

這個查詢返回一個如下面示例所示的XML片斷:  



OPENXML 功能執行與FOR XML 條件子句相反的功能,它建立一個XML文件的rowset ,如下面的示例所示:

DECLARE @doc nvarchar(1000)
SET @doc = '
 
 
 
'
DECLARE @xmlDoc integer
EXEC sp_xml_preparedocument @xmlDoc OUTPUT, @doc
SELECT * FROM
OPENXML (@xmlDoc, 'Order/Item', 1)
WITH
(OrderID integer '../@OrderID',
ProductID integer,
Quantity integer)
EXEC sp_xml_removedocument @xmlDoc

注意用sp_xml_preparedocument和sp_xml_removedocument 儲存過程來建立XML文件的節點樹的一個記憶體展示的用法。這個Transact-SQL 程式碼返回下面的rowset。 

OrderID ProductID Quantity 1011 1 2 1011 2 1

你可以使用xml 資料型別來儲存資料庫中的文件或資料。列和變數可以用於非型別化的XML或型別化的XML,後者是對一個XML Schema 定義(XML Schema Definition ,XSD)的schema有效。如果要為資料驗證進行定義,開發人員可以使用CREATE XML SCHEMA COLLECTION 語句,如下面的示例所示:

在建立了一個schema 集合後,你可以通過參照schema集合將一個xml變數或列與它所包含的schema 宣告結合起來,如下面的示例所示:

CREATE TABLE SalesOrders
(OrderID integer PRIMARY KEY,
OrderDate datetime,
CustomerID integer,
OrderNotes xml)

型別化XML在插入值或更新值時對關聯的schema 集合的宣告進行驗證,這使得可以為了遵從性檢查或相容性原因而加強關於XML資料的結構的業務規則。

xml 資料型別還提供了一些方法,使得你可以使用它們來查詢和操縱例項的XML資料。例如,你可以使用query 方法來查詢xml 資料型別的一個例項的XML資料,如下面的示例所示:

declare @x xml
set @x=
'

 Kim Abercrombie
 
 
 
 
 



 Margaret Smith
 
 
 


'
SELECT @x.query(
'
{
for $invoice in /Invoices/Invoice
return $invoice/Customer
}
')

這個例子中的查詢使用了一個XQuery 表示式,這個表示式找出文件中的每一個Invoice 元素,並返回一個包含每一個Invoice 元素的Customer元素的XML文件,如下面的示例所示:


 Kim Abercrombie
 Margaret Smith

SQL Server 2005中的另外一個顯著的與XML相關的特性是對XML索引的支援。你可以為型別化xml的列建立首要和次要的XML索引來增強XML查詢效能,一個首要的XML索引是一個XML例項的所有節點的部分表示,查詢處理器可以使用它來快速的找到一個XML值中的節點。在你建立了一個首要的XML索引之後,你可以建立次要的XML索引來提高特定的查詢型別的效能。下面的示例建立了一個首要的XML索引,和一個PATH型別的次要XML索引,它可以提高使用XPath表示式來標識一個XML例項中的節點的查詢的效能。

  CREATEPRIMARYXMLINDEXidx_xml_Notes
  ONSalesOrders(Notes)
  GO
  CREATEXMLINDEXidx_xml_Path_Notes
  ONSalesOrders(Notes)
  USINGXMLINDEXidx_xml_Notes
  FORPATH
  GO

2.2 SQL Server 2005中的XML功能

在SQL Server 2005中,FOR XML 功能得到了增強,它有了對根元素和元素名稱的新的選項、使用FOR XML 呼叫以便你可以建立複雜的層次關係的能力、和一個新的使得你可以定義將要使用XPath 語法來提取的XML結構的PATH 模式,如下面的示例所示:

SELECT ProductID AS '@ProductID',
ProductName AS 'ProductName'
FROM Products
FOR XML PATH ('Product'), ROOT ('Products')

這個查詢返回下面的XML:



Widget


Sprocket

除了增強SQL Server 2000已推出的XML功能,SQL Server 2005增加了一個新的、本地的xml 資料型別,使得你可以為XML資料建立變數和列,如下面的示例所示:

CREATE XML SCHEMA COLLECTION ProductSchema AS
'

 <!-- schema declarations go here --&gt
'

2.3 SQL Server 2008中的XML功能

XML功能是在SQL Server 2000和SQL Server 2005中推出的,在SQL Server 2008中得到了增強。在SQL Server 2008中主要的與XML相關的改進包括:

· 改進了schema 驗證能力

· 增強了對XQuery 的支援

· 增強了XML資料操縱語言(DML)的插入功能

本篇白皮書的其餘部分描述了這些增強之處,並介紹了你怎樣在SQL Server 2008中使用它們來實現更好的XML解決方案。

3 增強了XML Schema驗證功能

你可以使用一個或多個XSD schema執行遵從性檢查,以此來驗證XML資料。一個schema為某個特定的XML資料結構定義被允許的XML元素和屬性,並通常用於確保XML文件按正確的結構包含進了所要求的所有資料元素。

SQL Server 2005推出了通過使用XML schema 集合來進行XML資料驗證。一般的方法是使用CREATE XML SCHEMA COLLECTION語句建立包含了針對你的XML資料的schema 規則的schema集合,然後當你要定義一個必須符合這個schema 集合中的schema 規則的xml欄位或變數時參照這個schema集合名稱。然後SQL Server會按照這個schema集合中的schema規則來驗證插入或更新進這個欄位或變數的所有資料。

在SQL Server 2005中的XML Schema支援實現了一個廣泛的純XML Schema規格的子集,並涵蓋了最常見的XML驗證場景。SQL Server 2008擴充套件了這個支援,使得它包含下面新增加的由客戶確定的schema 驗證要求:

· 對lax 驗證的支援

· 對dateTime、time和date 驗證的完全支援,包括時區資訊的儲存。

· 改進了對union和list型別的支援

3.1 支援Lax驗證

XML Schema通過使用any、anyAttribute和anyType宣告來支援XML文件中的萬用字元。例如,看看下面的XML schema 宣告:


 
  
  
  minOccurs="0" maxOccurs="unbounded"/>
 

這個schema 宣告定義了一個叫做Order 的XML元素,它必須包含叫做CustomerName和OrderTotal的子元素。此外,這個元素可以包含Order型別所屬的名稱空間之外的其它名稱空間的無限制數目的其它元素。下面的XML顯示了一個包含由這個schema 宣告所定義的Order 元素的一個例項的XML文件。注意這個order 還包含了一個shp:Delivery 元素,它沒有在schema中明確定義。

  xmlns:shp="http://adventure-works.com/shipping">
  
  Graeme Malcolm
  299.99
  Express
  

對萬用字元的驗證取決於在schema定義中的萬用字元的processContents 屬性。在SQL Server 2005中,schema可以使用用於any和anyAttribute宣告的skip和strict 的processContents值。在前面的示例中,這個萬用字元元素的processContents屬性被設定為skip,所以不會對這個元素的內容進行驗證。即使這個schema集合包含一個對shp:Delivery元素的宣告(例如,定義一組有效的傳送方法對Order元素中的萬用字元),這個元素也不會被驗證,除非在Order元素中對萬用字元的宣告將它的processContents屬性設定為strict。

SQL Server 2008增加了對第三方驗證的支援。通過將一個萬用字元的processContents屬性設定為lax ,你可以對具有相應的schema 宣告的任何元素進行驗證,但忽略沒有在schema 中定義的所有元素。繼續前面的示例,如果你將schema中對萬用字元元素的宣告中的processContents屬性設定為lax 並增加一個對shp:Delivery元素的宣告,那麼在XML文件中的shp:Delivery 元素會被進行驗證。然而,如果不是shp:Delivery 元素,而是該文件包含了一個沒有在schema中宣告的元素,那麼這個元素會被忽略掉。

此外,XML Schema 規格定義anyType宣告具有對它的內容模型的lax處理方式。SQL Server 2005不支援lax處理,所以會嚴格的對內容進行驗證。SQL Server 2008支援anyType 內容的lax處理,因此內容會被正確的進行驗證。

3.2 對 xs:dateTime 的完全支援

你可以在一個XML schema 中使用dateTime資料型別來定義日期和時間資料。日期和時間資料以2007-08-01T09:30:00:000Z的格式來顯示,這表示的是通用協調時(UTC)2007年8月1日早上9:30,這用Z表示。其它的時區顯示的時間與通用協調時間不同,因此例如你能使用太平洋標準時間2007-12-25T06:00:00:000-8:00來顯示2007年12月25日的早上6:00(它比UTC時間滯後8小時)。

XML Schema 規格定義了可選擇的dateTime、date和time 資料型別的時區元件。然而,在SQL Server 2005中你必須提供一個用於dateTime、date和time資料的時區。此外,SQL Server 2005不儲存你的dateTime或time資料的時區資訊,但是會將它規格化為UTC時間(所以例如,如果你的XML有個2007-12-25T06:00:00:000-8:00的值,SQL Server 2005會將它規格化為2007-12-25T14:00:00:000Z。)在SQL Server 2008中沒有這些限制,所以當你儲存dateTime、date或time資料時你可以省略時區資訊,並且你提供的任何時區資訊都會被儲存下來。

3.3 Union和List型別

你可以使用XML schema 將你的XML資料的資料型別定義為允許將一個有限集合的值賦給具有多個值的元素和屬性。例如,你可能定義一個sizeListType型別,它使產品定義中的一個AvaliableSizes元素的賦值限制為S、M和L。SQL Server 2005支援XML schema包含這些簡單的型別定義和限制。例如,你可以使用一個list型別來定義一個產品的有效的型號,如下面的示例所示:


  
  
    
  
  
  
  

  

  


這個schema 宣告使你可以建立一個列出所有型號的元素,其中產品可以按照被空格分開的一組值來購買,如下面的示例所示:  

S M L

然而,如果你想支援兩種不同的方式來表達一個產品的型號呢?例如,假設一個自行車產品零售商賣具有大、中、小型號的騎自行車穿的衣服,但是還想按照衣服尺寸來賣(例如18、20、22和24)?為了使你能夠這樣做,SQL Server 2008增加了對包含list型別的union型別的支援,你可以使用它將多個型別定義和限制合併到一個單獨的型別中去。例如,下面的Transact-SQL程式碼建立了一個XML schema集合,它定義了一個productSizeType型別,其中有效值包括一組數字型號(18、20、22和24)和一組名稱型號(S、M和L)。

CREATE XML SCHEMA COLLECTION CatalogSizeSchema AS N'                                                                                                                                                                                           '

有了schema中的這個宣告,任何基於productSizeType 的元素都可以包含任何種類的列表;所以下面示例中的兩種產品元素都是productSizeType資料型別的有效的例項。


  
  Road Bike
  22 24
  

  
  Cycling Jersey
   S M L
  

  

類似的,SQL Server 2008支援對包含union 型別的list 型別的schema 宣告。

4 增強了XQuery

SQL Server 2005推出了xml 資料型別,它提供了一些你可以使用的方法來對儲存在一個列或變數中的XML資料進行操作。你可以執行的大多數操作都使用XQuery語法來操縱和使用XML資料。SQL Server 2005所支援的XQuery 語法包括被稱作FLWOR 表示式的for、where、order by和return 條件子句,你可以使用它來迴圈迭代一個XML文件的節點和返回結果值。

SQL Server 2008增加了對let條件子句的支援,它是用來在XQuery表示式中對變數進行賦值的,例如下面的示例:

declare @x xml
  set @x=
  '
  
   Kim Abercrombie
  
  
  
  
  

  

  
   Margaret Smith
  
  
  

  

  
'
  SELECT @x.query(
  '
  {
  for $invoice in /Invoices/Invoice
  let $count :=count($invoice/Items/Item)
  order by $count
  return
  
  {$invoice/Customer}
  {$count}
  

  }
')

這個例子返回下面的XML:



 Margaret Smith
 1


 Kim Abercrombie
 3


要注意SQL Server 2008不允許對構造元素賦值。

5 XML DML增強

像可以使用XQuery 表示式對XML資料執行操作一樣,xml 資料型別支援XML DML 表示式通過它的modify 方法來執行insert、replace value of和delete。你可以使用這些XML DML 表示式來操縱一個xml 列或變數中的XML資料。

SQL Server 2008增加了對在一個要執行插入XML資料到一個現有的XML結構中去的insert表示式中使用xml 變數的支援。例如,假設一個叫做@productList的xml 變數包含以下XML:


  Mountain Bike
  Road Bike

你可以使用下面的程式碼將一個新的自行車插入到產品列表中:

DECLARE @newBike xml
  SET @newBike = 'Racing Bike'
  SET @productList.modify
('insert sql:variable("@newBike") as last into (/Products)[1]')

執行了這個程式碼之後,@productList 變數會包括以下XML。 


  Mountain Bike
  Road Bike
  Racing Bike
  

6 總結

SQL Server 2008建立在SQL Server 2005中對XML的全面支援之上,並擴充套件了建立強大的將關係資料和XML結合在一起的資料庫解決方案的能力。應用程式開發人員將會發現對XML schema 支援的改進和對xml 資料型別的增強所帶來的好處是非常吸引人的。

<!-- 分頁 <!-- 分頁end

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-629695/,如需轉載,請註明出處,否則將追究法律責任。

相關文章