XML與SQL SERVER2005 (五)
------------------------------------------------------------------------
-- Author : HappyFlyStone
-- Date : 2009-09-02
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--
-- 本文探討 SQL Server 2005 中內置的 XML 支持.
-- 第五篇旨對路徑表達式中的軸步驟謂詞詳細說明。
-- 本文來自happyflystone -CSDN博客,
-- 轉載請標明出處:http://blog.csdn.net/happyflystone
------------------------------------------------------------------------
3、 謂詞
謂詞表達式用方括號括起來,來篩選特定的節點序列。
來來,先看個例子吧
declare @xml xml
set @xml = '<address>
<exam>
<name>
<firstname>fly</firstname>
<lastname>stone1</lastname>
</name>
<street> 1401 Main Street </street>
<city state="NC">Anytown</city>
<postal-code> 210000 </postal-code>
</exam>
<exam>
<name>
<firstname>fly</firstname>
<lastname>stone2</lastname>
</name>
<street> 1402 Main Street </street>
<city state="NM">Anytown</city>
<postal-code> 210000 </postal-code>
</exam>
</address>
'
--1
select @xml.query('//address/exam/name/firstname[1]')
/*
-------------------------------------------------------
<firstname>fly</firstname><firstname>fly</firstname>
(1 行受影響)
*/
--2
select @xml.query('//address/exam[1]/name/firstname')
/*
---------------------------------------------------
<firstname>fly</firstname>
(1 行受影響)
*/
--3
select @xml.query('(//address/exam)[1]/name/lastname')
/*
-----------------------------------------------------
<lastname>stone1</lastname>
(1 行受影響)
*/
--4
select @xml.query('(//address/exam)[2]/name/lastname')
/*
-----------------------------------------------------
<lastname>stone2</lastname>
(1 行受影響)
*/上面表達式中的[1]、[2]就是謂詞,大家注意括號對路徑表達式的影響哦,在本例第三種寫法大家自己比較吧,另外比較第三種與第四種的不同及結果的不同哈。
謂詞自身的括號內可多次使用和添加量詞,下面這個例子:
select @xml.query('//address/exam/name/lastname[1]')
select @xml.query('//address/exam[contains(street[1],"1402")]/name/lastname[1]')
select @xml.query('//address/exam[contains(street[1],"1402") and xs:integer(postal-code[1])>200000]/name/lastname[1]')
/*
--------------------------------------------------------
<lastname>stone1</lastname><lastname>stone2</lastname>
(1 行受影響)
---------------------------------------------------------
<lastname>stone2</lastname>
(1 行受影響)
---------------------------------------------------------
<lastname>stone2</lastname>
(1 行受影響)
*/
注:當謂詞表達式的值是一個空序列時的情況:
select @xml.query('//address/exam/name[attribute::idq]')
select @xml.query('//address/exam/name[attribute::id]/firstname[1]')
嘿嘿,大體上說完軸步驟了,下回的議題容我想好再定!!