XML與SQL SERVER2005 (五)

XMLSQL 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]')

 

 

嘿嘿,大體上說完軸步驟了,下回的議題容我想好再定!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章