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