一、引言
如今,在SQL Server 2005中,XML成為第一流的數據類型。借助于基于XML模式的強類型化支持和基于服務器端的XML數據校驗功能,現在
,開發者可以對存儲的XML文檔進行輕松地遠程修改。作為數據庫開發者,許多人都必須大量地涉及XML。
如今,在SQL Server 2005中,你能以一種新的數據類型的形式把XML存儲在數據庫中。
事實上,在SQL Server 2000中就已經包括了一些XML特征。其中,最關鍵的特征是使用FOR XML語句以XML形式返回結果。SQL Server 2005
的功能則明顯不同。在SQL Server 2005中,XML是一種真正的數據類型;這意味著,你可以使用XML作為表和視圖中的列,XML可以用于T-SQL語
句中或作為存儲過程的參數。現在,你可以直接在數據庫中存儲、查詢和管理XML文件。
更重要的是,現在你還能規定你的XML必須遵從的模式。
在SQL Server 2005中,除了提供機制以校驗你的數據庫中的XML類型之外,它還允許你描述要被存儲的復雜數據類型并且提供一個引擎來
強制施加這些規則。
二、使用XML數據類型
其實,XML數據類型與SQL Server中的其它數據類型并不存在根本的區別。你可以把它用在使用任何普通SQL數據類型的地方。例如,下列
語句創建一個XML變量并用一個XML填充它:
DECLARE @doc XML
SELECT @doc = '<Team name="Braves" />'
另外,你還可以使用一個查詢和SQL Server的FOR XML語法來填充一個XML變量:
SELECT @doc =
(SELECT * FROM Person.Contact FOR XML AUTO)
XML數據類型不僅可以作為變量使用,也可以應用于表列中。你還能分配缺省值并且支持NOT NULL約束:
| 以下為引用的內容: CREATE TABLE Team |
注意:SQL Server 2005的XML功能與SQL Server 2000中具有明顯的不同。
把XML數據插入到表格中只需要用字符串形式的XML指定即可。
下列示例插入一組記錄:
| 以下為引用的內容: INSERT INTO Team (TeamDoc) |
當在SQL Server 2005中創建XML的實例時,唯一的轉換是從一個字符串轉換成一個XML類型。同樣,沿著相反的方向,你只可以把XML類型
轉換成一個字符串類型。在text和ntext類型之間轉換是不允許的。
三、XML數據類型的限制
盡管在SQL Server 2005中XML數據類型就象許多其它數據類型一樣對待,但是還存在一些如何使用它的具體限制。這些限制是:
· XML類型不能轉換成text或ntext數據類型。
· 除了string類型,沒有其它數據類型能夠轉換成XML。
· XML列不能應用于GROUP BY語句中。
· 分布式局部(partitioned)視圖不能包含XML數據類型。
· sql_variant實例的使用不能把XML作為一種子類型。
· XML列不能成為主鍵或外鍵的一部分。
· XML列不能指定為唯一的。
· COLLATE子句不能被使用在XML列上。
· XML列不能加入到規則中。
· 唯一可應用于XML列的內置標量函數是ISNULL和COALESCE。沒有任何其它內置標量函數支持使用XML類型。
· 表中最多只能擁有32個XML列。
· 具有XML列的表不能有一個超過15列的主鍵。
· 具有XML列的表不能有一個timestamp數據類型作為它們的主鍵的一部分。
· 存儲在數據庫中的XML僅支持128級的層次。
四、XML類型方法
到此為止,上面的示例已經展示了XML數據類型僅能用作一種blob類型數據,但是這正是XML數據類型顯示其自身力量的地方。XML數據類型
支持使用UDT點(myXML.operation())語法進行調用的若干方法。下表1中列舉出所支持的方法。
表格1:XML數據類型方法。
方法名 描述
query 執行一個XML查詢并且返回查詢的結果
exists 執行一個XML查詢,并且如果有結果的話返回值1
value 計算一個查詢以從XML中返回一個簡單的值
modify 在XML文檔的適當位置執行一個修改操作
nodes 允許你把XML分解到一個表結構中
在下面幾節中,你要使用一個表Team,它的每一個行中包含一個小組的名字。在每一行中,有一個包含有關于該小組的XML數據的TeamDoc
行:
| 以下為引用的內容: CREATE TABLE Team 在這些例子中,我們假定下面的XML文檔存在于表中的Braves行中: <Team name="Braves"> |
query方法
注意:你可以在表和視圖列、T-SQL語句或存儲過程的參數中使用XML。
這個方法允許你指定一個要計算的Xquery或XPath表達式,該方法的結果是一個XML數據類型對象。它的具體語法形式如下:
query(XQuery)
第一個參數總是一個Xquery表達式。下面的例子使用一個查詢來返回一個XML文檔-其中包含有關每一個小組的投球手的信息:
SELECT TeamDoc.query('/Team/Players/Pitcher')
FROM Team
這個語句產生如下結果:
| 以下為引用的內容: ---------------------------------------------- <Pitcher name="John Smoltz" role="Closer" /> <Pitcher name="Russ Ortiz" role="Starter" /> (1 row(s) affected) |
這個query方法允許你查詢和返回與你指定的表達式相匹配的結點列表。該方法的真正威力來自于XQuery語法,我們將在本文后面再詳細討
論。
exist方法
這個exist方法用于決定是否一個查詢能夠產生任何結果。這個exist方法的語法形式如下:
exist(XQuery)
當你使用這個exist方法時,它計算這個XQuery查詢,并且如果該查詢產生任何結果的話返回值1。例如,下面語句查詢小組表行中是否
TeamDoc域中存有Starter投手:
下面是簡單的Exist語句:
| 以下為引用的內容: SELECT Count(*) FROM Team WHERE TeamDoc.exist( '/Team/Players/Pitcher[@role="Starter"]') = 1 |
新聞熱點
疑難解答