首先要明確一個基本原則,XML類型的數據之間以及XML類型與其它數據類型之間都是不能比較的,也就是說XML類型的數據不能出現在等號的任何一邊。
大致可分為查詢類,修改類和跨域查詢類。
查詢類包含query(),value(),exist()和nodes().
修改類包含modify().
跨域查詢類包含sql:variable()和sql:column().
查詢類
1. query()方法:返回滿足條件的所有XML行。只能用於SELECT子句當中。
2. value()方法:返回從XML節點中提取的標量值。必須在value()方法的第二個參數中指定所返回的標量的數據類型,所以value()方法可以與其它標量進行比較。可用於SELECT子句和WHERE子句。
3. exist()方法:返回int型標量的0或者1。對每行的XML數據類型進行存在性檢查。可用於SELECT子句和WHERE子句。
4. nodes()方法:返回只有一個欄位的table,且該table的欄位是XML數據類型。所以nodes()方法只能出現在FROM子句中。
示例:
1.query()
SELECT pk, xCol.query('/doc[@id = 123]//section') FROM docs
2.value()
SELECT xCol.value('data((/doc//section[@num = 3]/heading)[1])', 'nvarchar(max)')
FROM docs
3.exist()
SELECT xCol.query('/doc[@id = 123]//section')
FROM docs
WHERE xCol.exist ('/doc[@id = 123]') = 1
4.nodes()
SELECT nref.value('@genre', 'varchar(max)') LastName
FROM docs CROSS APPLY xCol.nodes('//book') AS R(nref)
修改類
modify()方法:允許修改XML實例的某些部分,例如添加或刪除子樹,或者更新標量值(如將書的價格從9.99替換為39.99)。
無返回值,只能用於SET子句中。
--在指定位置添加子樹('insert...after...')
UPDATE docs SET xCol.modify('
insert
<section num="2">
<heading>Background</heading>
</section>
after (/doc/section[@num=1])[1]')
--更改指定節點中的標量值('replace...with...')
UPDATE XMLCatalog
SET Document.modify ('
default namespace = "http://myBooks"
replace value of (/bookstore/book[@ISBN=
"1-8610-0311-0"]/price)[1] with 49.99')
跨域查詢類
如果數據駐留在關系數據類型的列和XML數據類型的列的組合中,就可能需要編寫查詢來組合關系數據處理和XML數據處理(組合的對象還可以是標量數據類型的SQL變量和XML數據),這樣的查詢就叫跨域查詢。
sql:variable()方法:可以在XQuery或XML DML表達式中應用SQL變量的值。
sql:variable()
DECLARE @isbn varchar(20)
SET @isbn = '0-7356-1588-2'
SELECT xCol
FROM docs
WHERE xCol.exist ('/book[@ISBN = sql:variable("@isbn")]') = 1
sql:column()方法:可以在XQuery或XML DML表達式中使用來自關系列的值。