XQuery

  • 15445
  • 0
  • SQL
  • 2008-07-24

Xquery

MS SQL提供了好用的Xquery來查詢xml的資料,以下提供幾個簡單的使用方式:

1.XQuery.nodes()

利用doc.nodes轉成table,然後用value(text())把內文取出。

 

SELECT 
	N.value('(TTL/text())[1]', 'nvarchar(max)') TTL,
	N.value('(PageCount/text())[1]', 'int') PCount
FROM @doc.nodes('/Record') V(N)

 

2.XQuery.node()

如果剛好想要取資料的LEVEL一樣,但節點名稱不同,可以用node()代替。

 

SELECT 
	N.value('name[1]/node()[1]/city[1]/text()[1]', 'nvarchar(max)') CTY,
	N.value('name[1]/node()[1]/state[1]/text()[1]', 'nvarchar(max)') STA
FROM @doc.nodes('/Record') V(N)

3.判定節點是否存在 []

想要先確認某一節點下是否有字,可以利用 [] 增加條件判斷。

 

SELECT 
	N.value('name[1]/node()[1]/city[1]/text()[1]', 'nvarchar(max)') CTY,
	N.value('name[1]/node()[1]/state[1]/text()[1]', 'nvarchar(max)') STA
FROM @doc.nodes('/Record[organization-name/text()]') V(N)

4.for-loop

使用for-loop可以取值(string--取字串)及重組xml tag,但資料還是xml

 

SELECT 
	convert(nvarchar(max) ,N.query('
		for $c im claim
		return
		<CLM>
			<PAR>( string($c) )</PAR>
		<CLM>') CLM1
FROM @doc.nodes('//claims') V(N)

5.插入節點

sql:variable是從外面宣告的一般sql參數,如:Decalre @nodeid nvarchar(max)

以下範例是找到某一節點後,插入一個節點在其第一位子節點。

 

SET @ClassXml.modify(
'insert
	<node id="{ sql:variable("@nodeid") }"
		name="{ sql:variable("@name") }">
	</node>
	as first into (//node[@id=(sql:variable("@id"))])[1]'

6.插入屬性

 

SET @ClassXml.modify(
'insert attribute
	count { sql:variable("@total") }
 into (//node[@id=(sql:variable("@id"))])[1]')
DotBlog 的標籤:,