關於SQLServer2005的學習筆記——XML的處理

bq_wang發表於2010-03-03
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE 

SQLServer2005中對XML的處理功能顯然增強了很多,提供了query(),value(),exist(),modify(),nodes()等函式。

關於xml,難以理解的不是SQLServer提供的函式,而是對xml本身的理解,看似很簡單的檔案格式,處理起來卻是非常困難的。本文只是初探一下而已。

詳見SQLServer聯機幫助:

主題

說明

此方法用於對 XML 例項進行查詢。

此方法用於從 XML 例項檢索 SQL 型別的值。

此方法用於確定查詢是否返回非空結果。

此方法用於指定 語句以執行更新。

此方法用於將 XML 拆分成多行以將 XML 文件的組成部分傳播到行集中。

 

閒話少說,首先建立一個包含xml型別的資料表,其次建立一個xml檔案,在服務端把xml檔案內容載入該資料表中。

CREATE TABLE VisioXML

(

  ID  INT,

  Doc XML

);

GO

建立一個名為xxx.xml的檔案,內容如下

/*

 

    1

    WBQ

 

 

    2

    CZH

 

*/

INSERT INTO VisioXML(ID,Doc)

SELECT 4,* FROM OPENROWSET(BULK 'e:\xxx.xml',SINGLE_BLOB) AS x;

 

--以下為value()query()的用法

--SELECT * FROM VisioXML WHERE ID=4

SELECT

  Doc.value('(/ROOT/ROW[1]/ID/text())[1]','int') RootRowID1,  --第一行ID的值,並且轉換為int型別

  Doc.value('(/ROOT/ROW[2]/ID/text())[1]','int') RootRowID2,  --第二行ID的值,並且轉換為int型別

  Doc.value('(/ROOT/ROW[1]/NAME/text())[1]','varchar(20)') RootRowNAME1,  --第一行NAME的值,並且轉換為VARCHAR型別

  Doc.value('(/ROOT/ROW[1]/NAME/@SEX)[1]','varchar(20)') RootRowNAME1SEX, --第一行NAMESEX屬性的值,並且轉換為VARCHAR型別

  Doc.query('/ROOT') Root,             --ROOT下的所有XML內容,型別為XML

  Doc.query('/ROOT/ROW[1]') RootRow1,  --ROOT下第一行所有的XML內容,型別為XML

  Doc.query('/ROOT/ROW[2]') RootRow2   --ROOT下第二行所有的XML內容,型別為XML

  FROM VisioXML

 WHERE ID=4

 

--以下為exist()函式在兩種環境下的用法

SELECT

  Doc.exist('/ROOT/ROW[1]/NAME[(@SEX cast as xs:string?) = xs:string("MALE")]') Row1EQStringMale,

  Doc.exist('/ROOT/ROW[1]/NAME[(@SEX cast as xs:string?) = "MALE"]') Row1EQMale,

  Doc.exist('/ROOT/ROW[1]/ID[(text()[1] cast as xs:float?) = xs:float(1)]') Row1EQfloat1,

  Doc.exist('/ROOT/ROW[2]/ID[(text()[1] cast as xs:float?) = 2]') Row1EQ1

  FROM VisioXML

 WHERE ID=4

 

SELECT ID,Doc

  FROM VisioXML

 WHERE ID=4

   AND Doc.exist('/ROOT/ROW[1]/NAME[(@SEX)]')=1      --第一行NAME中存在SEX屬性

   --AND Doc.exist('/ROOT/ROW[1]/NAME[not(@SEX)]')=1 --第一行NAME中不存在SEX屬性

   --AND Doc.exist('/ROOT/ROW[1][not(ID/*)]')=1      --第一行不存在ID欄位

   --AND Doc.exist('/ROOT/ROW[1][(ID/*)]')=1         --第一行存在ID欄位

 

 

 

 

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

相關文章