top
Loading...
SQLServer2005的XML數據修改語言

作為對XQuery語言的擴展,XML DML為XML數據操作提供了更大的靈活性,而不再僅僅是對XML數據進行一些查詢操作。通過XML DML,用戶可以像操作關系表一樣對XML中的節點內容進行插入、更新和刪除操作。XML DML需要通過xml數據類型的modify方法進行調用。

1.insert

insert用于將Expression1標識的一個或多個節點作為Expression2標識的節點的子節點或同級節點插入。語法格式如下:

insert       Expression1 (                 {as first | as last} into | after | before                                    Expression2                )

Expression1和Expression2

標識要插入的一個或多個節點。它可以是常量XML實例,也可以是XQuery表達式。該表達式可以得出節點、文本節點或一組有序的節點,但它無法解得根節點。如果該表達式得出一個值或一組值,則這些值作為單個文本節點插入,各值之間以空格分隔開。如果將多個節點指定為常量,則這些節點用括號括住,并以逗號分隔開。但無法插入異構序列(如一組元素、屬性或值)。如果Expression1解得一個空序列,則不會發生插入操作,并且不會返回任何錯誤。

into

Expression1標識的節點作為Expression2標識的節點的子節點插入。如果Expression2中的節點已有一個或多個子節點,則必須使用as first或as last來指定所需的新節點添加位置。

after

Expression1標識的節點作為Expression2標識的節點的同級節點直接插入在其后面,after關鍵字不能用于插入屬性。

before

Expression1標識的節點作為Expression2標識的節點的同級節點直接插入在其前面,before關鍵字不能用于插入屬性。

(1)插入元素文檔中

在下面的示例中,首先將XML文檔分配給xml類型的變量。然后使用幾個insert XML DML語句說明如何將元素節點插入文檔中。注意在示例中為各種路徑表達式都指定了“[1]”,以要求每次只返回單個目標,這樣就確保了只有單個目標節點。每次插入后,SELECT語句都會顯示結果。最終執行結果如圖1所示。

DECLARE @myDoc xml       SET @myDoc = '                             '       SELECT @myDoc       -- 插入item的第1個子節點,此時不需要指定as first或as lastSET @myDoc.modify('       insert 張洪舉into (/root/item)[1]') SELECT @myDoc       -- 插入item的第2個子節點,as first指定插入到同級子節點的前面       SET @myDoc.modify('       insert SQL Server 2005開發寶典as first into (/root/item)[1]')       SELECT @myDoc       -- 插入第2個item節點SET @myDoc.modify('       insert into (/root)[1]')       SELECT @myDoc   -- 向第2個item中插入第1個子節點   SET @myDoc.modify('       insert SQL Server 2005的新增功能as first into (/root/item)[2]')       SELECT @myDocGO

圖1 向XML中插入節點

(2)插入多個元素到文檔中

在下面的示例中,將title和author元素插入到了item節點中。元素之間使用逗號分隔,并包含在括號中。

DECLARE @myDoc xmlSET @myDoc = '                             '   SELECT @myDocSET @myDoc.modify('       insert (      SQL Server 2005開發寶典,      張洪舉       )into (/root/item)[1]'); SELECT @myDoc   GO

(3)插入屬性到文檔中

在下面的示例中,向XML文檔中插入了多個屬性。每次插入屬性后,SELECT語句都會顯示結果,最終執行結果如圖2所示。

DECLARE @myDoc xml       SET @myDoc = '                   Ajax實戰        張洪舉           '   SELECT @myDocSET @myDoc.modify('       insert attribute ShipTo {"廣州"}into (/root/item[@ID=1])[1]'); SELECT @myDoc       -- 通過一個sql變量指定要插入屬性ShipDate的值           DECLARE @ShipDate char(11)           SET @ShipDate='2006-01-23Z'           SET @myDoc.modify('           insert attribute ShipDate {sql:variable("@ShipDate") cast as xs:date ?}           into (/root/item[@ID=1])[1]') ;          SELECT @myDoc           -- 插入多個屬性,屬性之間使用逗號分隔,并包含在括號內           SET @myDoc.modify('           insert (                    attribute PostCode {"253020" },                   attribute Weight {"1.5"}                   )           into (/root/item[@ID=1])[1]');SELECT @myDocGO

圖2插入屬性到XML中

(4)插入注釋節點

在下面的示例中,將注釋節點插入到ID為2的item節點中title元素的后面。

DECLARE @myDoc xml       SET @myDoc = '                   Ajax實戰        張洪舉                ASP.NET實戰        盧桂章     '   SET @myDoc.modify('           insert            after (/root/item[@ID=2]/title)[1]');SELECT @myDocGO

插入注釋后XML的內容如下:

           Ajax實戰        張洪舉              ASP.NET實戰                盧桂章   

(5)使用CDATA部分插入數據

當插入的文本中包含有XML無效字符(如“<”或“>”)時,可以使用CDATA部分插入數據。參考下面的示例:

DECLARE @myDoc xml       SET @myDoc = '                   Ajax實戰        張洪舉                ASP.NET實戰        盧桂章     '   SET @myDoc.modify('           insert 上門<價款>未收]]> into (/root/item[@ID=2])[1] ') ; SELECT @myDoc GO

被插入部分中的XML無效字符,會被轉換成實體,如“<”保存為<。下面的插入CDATA部分后XML文檔的內容:

           Ajax實戰        張洪舉              ASP.NET實戰        盧桂章         <送貨方式>上門<價款>未收   

(6)插入文本節點

要將文件插入到XML中,需要使用text函數構造文本,參考下面的示例:

DECLARE @myDoc xml       SET @myDoc = '                   Ajax實戰        張洪舉    '   SET @myDoc.modify('insert text{"訂單列表"} as first into (/root)[1]');SELECT @myDocGO

得到的XML結果如下:

訂單列表Ajax實戰張洪舉

(7)將節點插入類型化的xml列中

在下面的示例中,首先創建了一個架構集合,并建立了一個使用該架構集合的表。在使用Transact-SQL INSERT語句向表中插入一個符合架構約束的XML后,再使用XML DML insert向該XML中插入一個item節點。

-- 創建XML架構集合

CREATE XML SCHEMA COLLECTION MySchemasASN'                                                                                                                                                                                                                                                                                                                ';GO-- 創建包含xml數據類型列的表CREATE TABLE MyCustomer    (CustomerID int IDENTITY PRIMARY KEY,      CustomerItem xml(MySchemas));GO-- 向表中插入XML,該XML應當符合http://schemas.mybook.com/customerschemas命名空間架構的定義INSERT INTO MyCustomerVALUES(N'            北方書城        北京市海淀區知春路22號        2222222        劉先生    ');-- 使用XML DML insert插入另一個item節點到XML中UPDATE MyCustomer SET CustomerItem.modify(' declare namespace CS="http://schemas.mybook.com/customerschemas"; insert (        東圖大廈        長春市朝陽大街99號        1111111        孫小姐    ) into (/CS:customer)[1] ') WHERE CustomerID=1;SELECT CustomerItem FROM Mycustomer;GO

執行上面的SELECT查詢后,可以看到CustomerItem中的XML內容,如下所示:

           北方書城        北京市海淀區知春路22號        2222222        劉先生              東圖大廈        長春市朝陽大街99號        1111111        孫小姐   

2.delete

delete用于刪除XML實例的節點。其語法格式如下:

delete Expression

Expression是要刪除的節點的XQuery表達式。刪除該表達式選擇的所有節點,以及所選節點中的所有節點或值。表達式不能是根(/)節點。如果表達式返回空序列,則不進行刪除,不返回錯誤。

下面的示例演示了從非類型化的xml變量中刪除指令、注釋、屬性、元素和節點的方法。在每次刪除后都會顯示XML,結果如圖3所示。

DECLARE @myDoc xmlSET @myDoc = '        這里是文本        Ajax實戰        張洪舉                ASP.NET實戰        盧桂章    'SELECT @myDoc-- 刪除注釋SET @myDoc.modify(' delete /root/comment()')SELECT @myDoc-- 刪除所有指令SET @myDoc.modify(' delete //processing-instruction()')SELECT @myDoc-- 刪除ID為1的item中的文本節點SET @myDoc.modify(' delete /root/item[@ID=1]/text()')SELECT @myDoc-- 刪除一個屬性SET @myDoc.modify(' delete /root/item[@ID=1]/@ShipTo')SELECT @myDoc-- 刪除一個元素SET @myDoc.modify(' delete /root/item[@ID=2]/author')SELECT @myDoc -- 刪除ID為2的item節點SET @myDoc.modify(' delete /root/item[@ID=2]')SELECT @myDocGO

圖3從非類型化xml變量中刪除注釋、指令、屬性、元素和節點

下面的語句演示從類型化XML中刪除節點的方法,其中的MyCustomer是前面在“將節點插入類型化的xml列中”部分中創建的。

UPDATE MyCustomerSET CustomerItem.modify(' declare namespace CS="http://schemas.mybook.com/customerschemas"; delete /CS:customer/item[@ID=2]');SELECT CustomerItem FROM MyCustomer;GO

3.replace

replace用于更新文檔中的值。其語法格式如下:

replace value of       Expression1 with      Expression2

Expression1

標識其值要更新的節點。它必須僅標識一個單個節點。如果XML已類型化,則節點的類型必須是具有簡單類型內容(列表或原子類型)的單個元素、文本節點或屬性節點,不能是聯合類型、復雜類型、處理指令、文檔節點或注釋節點。否則,將返回錯誤。

Expression2

標識節點的新值。在修改類型化的XML實例中,Expression2與Expression1必須是相同類型。

下面的示例演示了更新XML中元素的文本和屬性值的方法。每次更改時,都會顯示XML,如圖4所示。

DECLARE @myDoc xmlSET @myDoc = '            Ajax實戰        張洪舉                ASP.NET實戰        盧桂章    'SELECT @myDoc-- 更新ID為1的item中的title元素的文本SET @myDoc.modify(' replace value of (/root/item[@ID=1]/title/text())[1] with "Ajax實戰攻略"')SELECT @myDoc-- 更新屬性值SET @myDoc.modify(' replace value of (/root/item[@ID=2]/@ID)[1] with "3"')SELECT @myDoc

圖4 更改XML中元素的文本和屬性值
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗