關(guān)于SQLServer2005的學(xué)習(xí)筆記 XML的處理
更新時間:2010年04月30日 16:38:08 作者:
在 SQLServer2005 中對 XML 的處理功能顯然增強(qiáng)了很多,提供了 query(),value(),exist(),modify(),nodes() 等函數(shù)。
關(guān)于 xml ,難以理解的不是 SQLServer 提供的函數(shù),而是對 xml 本身的理解,看似很簡單的文件格式,處理起來卻是非常困難的。本文只是初探一下而已。
詳見 SQLServer 聯(lián)機(jī)幫助:
主題
說明
query() 方法( xml 數(shù)據(jù)類型)
此方法用于對 XML 實(shí)例進(jìn)行查詢。
value() 方法( xml 數(shù)據(jù)類型)
此方法用于從 XML 實(shí)例檢索 SQL 類型的值。
exist() 方法( xml 數(shù)據(jù)類型)
此方法用于確定查詢是否返回非空結(jié)果。
modify() 方法( xml 數(shù)據(jù)類型)
此方法用于指定 XML DML 語句以執(zhí)行更新。
nodes() 方法( xml 數(shù)據(jù)類型)
此方法用于將 XML 拆分成多行以將 XML 文檔的組成部分傳播到行集中。
閑話少說,首先創(chuàng)建一個包含 xml 類型的數(shù)據(jù)表,其次創(chuàng)建一個 xml 文件,在服務(wù)端把 xml 文件內(nèi)容加載該數(shù)據(jù)表中。
CREATE TABLE VisioXML
(
ID INT,
Doc XML
);
GO
創(chuàng)建一個名為 xxx.xml 的文件,內(nèi)容如下
/*
<ROOT>
<ROW>
<ID>1</ID>
<NAME SEX="MALE">WBQ</NAME>
</ROW>
<ROW>
<ID>2</ID>
<NAME SEX="FEMALE">CZH</NAME>
</ROW>
</ROOT>
*/
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 的值,并且轉(zhuǎn)換為 int 類型
Doc.value('(/ROOT/ROW[2]/ID/text())[1]','int') RootRowID2, -- 第二行 ID 的值,并且轉(zhuǎn)換為 int 類型
Doc.value('(/ROOT/ROW[1]/NAME/text())[1]','varchar(20)') RootRowNAME1, -- 第一行 NAME 的值,并且轉(zhuǎn)換為 VARCHAR 類型
Doc.value('(/ROOT/ROW[1]/NAME/@SEX)[1]','varchar(20)') RootRowNAME1SEX, -- 第一行 NAME 中 SEX 屬性的值,并且轉(zhuǎn)換為 VARCHAR 類型
Doc.query('/ROOT') Root, --ROOT 下的所有 XML 內(nèi)容,類型為 XML
Doc.query('/ROOT/ROW[1]') RootRow1, --ROOT 下第一行所有的 XML 內(nèi)容,類型為 XML
Doc.query('/ROOT/ROW[2]') RootRow2 --ROOT 下第二行所有的 XML 內(nèi)容,類型為 XML
FROM VisioXML
WHERE ID=4
-- 以下為 exist() 函數(shù)在兩種環(huán)境下的用法
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 字段
詳見 SQLServer 聯(lián)機(jī)幫助:
主題
說明
query() 方法( xml 數(shù)據(jù)類型)
此方法用于對 XML 實(shí)例進(jìn)行查詢。
value() 方法( xml 數(shù)據(jù)類型)
此方法用于從 XML 實(shí)例檢索 SQL 類型的值。
exist() 方法( xml 數(shù)據(jù)類型)
此方法用于確定查詢是否返回非空結(jié)果。
modify() 方法( xml 數(shù)據(jù)類型)
此方法用于指定 XML DML 語句以執(zhí)行更新。
nodes() 方法( xml 數(shù)據(jù)類型)
此方法用于將 XML 拆分成多行以將 XML 文檔的組成部分傳播到行集中。
閑話少說,首先創(chuàng)建一個包含 xml 類型的數(shù)據(jù)表,其次創(chuàng)建一個 xml 文件,在服務(wù)端把 xml 文件內(nèi)容加載該數(shù)據(jù)表中。
復(fù)制代碼 代碼如下:
CREATE TABLE VisioXML
(
ID INT,
Doc XML
);
GO
創(chuàng)建一個名為 xxx.xml 的文件,內(nèi)容如下
/*
<ROOT>
<ROW>
<ID>1</ID>
<NAME SEX="MALE">WBQ</NAME>
</ROW>
<ROW>
<ID>2</ID>
<NAME SEX="FEMALE">CZH</NAME>
</ROW>
</ROOT>
*/
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
復(fù)制代碼 代碼如下:
SELECT
Doc.value('(/ROOT/ROW[1]/ID/text())[1]','int') RootRowID1, -- 第一行 ID 的值,并且轉(zhuǎn)換為 int 類型
Doc.value('(/ROOT/ROW[2]/ID/text())[1]','int') RootRowID2, -- 第二行 ID 的值,并且轉(zhuǎn)換為 int 類型
Doc.value('(/ROOT/ROW[1]/NAME/text())[1]','varchar(20)') RootRowNAME1, -- 第一行 NAME 的值,并且轉(zhuǎn)換為 VARCHAR 類型
Doc.value('(/ROOT/ROW[1]/NAME/@SEX)[1]','varchar(20)') RootRowNAME1SEX, -- 第一行 NAME 中 SEX 屬性的值,并且轉(zhuǎn)換為 VARCHAR 類型
Doc.query('/ROOT') Root, --ROOT 下的所有 XML 內(nèi)容,類型為 XML
Doc.query('/ROOT/ROW[1]') RootRow1, --ROOT 下第一行所有的 XML 內(nèi)容,類型為 XML
Doc.query('/ROOT/ROW[2]') RootRow2 --ROOT 下第二行所有的 XML 內(nèi)容,類型為 XML
FROM VisioXML
WHERE ID=4
-- 以下為 exist() 函數(shù)在兩種環(huán)境下的用法
復(fù)制代碼 代碼如下:
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
復(fù)制代碼 代碼如下:
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 字段
您可能感興趣的文章:
- SQL Server解析XML數(shù)據(jù)的方法詳解
- SQL Server中的XML數(shù)據(jù)進(jìn)行insert、update、delete操作實(shí)現(xiàn)代碼
- SQLServer2005 XML數(shù)據(jù)操作代碼
- SQLSERVER 2005中使用sql語句對xml文件和其數(shù)據(jù)的進(jìn)行操作(很全面)
- SQL Server中的XML數(shù)據(jù)進(jìn)行insert、update、delete
- SQLServer XML數(shù)據(jù)的五種基本操作
- SQL?Server中的XML數(shù)據(jù)類型詳解
相關(guān)文章
SQL Server 使用 SET FMTONLY ON 獲得表的元數(shù)據(jù)
本文介紹SQL Server2005以及之后的版本,通過 SET FMTONLY ON 獲得表的元數(shù)據(jù)的方法,小伙伴們可以參考一下。2016-05-05
安裝MSSql2005時 “以前的某個程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起” 的解決辦法
安裝MSSql2005時 “以前的某個程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起” 的解決辦法2010-02-02
sql2005創(chuàng)建遠(yuǎn)程登錄帳戶的sql語句
有時候我們需要創(chuàng)建遠(yuǎn)程登錄賬號,這里簡單分享下,方便需要的朋友2013-04-04
SQL2008中通過DBCC OPENTRAN和會話查詢事務(wù)
無論是有意無意,如果事務(wù)在數(shù)據(jù)庫中保持打開,則它會阻塞其他進(jìn)程對修改后的數(shù)據(jù)進(jìn)行操作。2011-06-06
一步一步教你創(chuàng)建SQL 2005計(jì)劃任務(wù)應(yīng)用圖解教程
使用sql的計(jì)劃任務(wù)可以處理一些特殊環(huán)境的數(shù)據(jù),除了使用windows系統(tǒng)的計(jì)劃任務(wù)來定時處理,不過要配合程序才行,有些事情可以直接使用sql本身的計(jì)劃任務(wù),更方便,所以本文圖解一下Sql2005計(jì)劃任務(wù)的創(chuàng)建使用。2010-03-03
SQL Server 連接到服務(wù)器 錯誤233的解決辦法
最近SqlServer有點(diǎn)大姨媽,開始報(bào)錯233,詳細(xì)如下:已成功與服務(wù)器建立連接,但是在登錄過程中發(fā)生錯誤。(provider:命名管道提供程序,error:0-管道的另一端上無任何進(jìn)程。)(Microsoft SQL Server,錯誤:233)2014-08-08
sqlserver2005 安裝圖解教程以及SQL 2005 SP3補(bǔ)丁安裝圖文教程
最近整理一些sql2005的安裝教程,好多朋友慢慢開始使用sql2005,進(jìn)行開發(fā)了,嘗試新事物。2009-08-08
SQL2005 ROW_NUMER實(shí)現(xiàn)分頁的兩種常用方式
SQL2005利用ROW_NUMER實(shí)現(xiàn)分頁的兩種常用方式2009-07-07

