[英]SQL Server Xpath to get text value for specific xml element
我有一個表updates
,每一行都有一個id
列和一個名為changes
的XML列。 每行的XML列將具有以下值:
<changes>
<update>
<field>assignedto</field>
<oldvalue>c713826</oldvalue>
<newvalue>Trainer</newvalue>
</update>
<update>
<field>status</field>
<oldvalue>inprogress</oldvalue>
<newvalue>query</newvalue>
</update>
<update>
<field>note</field>
<oldvalue />
<newvalue>January 2016 or 2017?</newvalue>
</update>
</changes>
我想為每個記錄查找newvalue
和oldvalue
的值,其中field = "AssignedTo"
。
對於每條記錄, AssignedTo
字段在XML中只會出現一次。
到目前為止,我已經使用過
where [changes].exist('/changes/update/field/text() [contains(.,"assignedto")]')
要只返回帶有AssignedTo字段的記錄,但是我很難選擇匹配的舊值和新值。
您可以像這樣從xml中選擇數據:
declare @data xml
select @data = '<changes>
<update>
<field>assignedto</field>
<oldvalue>c713826</oldvalue>
<newvalue>Trainer</newvalue>
</update>
<update>
<field>status</field>
<oldvalue>inprogress</oldvalue>
<newvalue>query</newvalue>
</update>
<update>
<field>note</field>
<oldvalue />
<newvalue>January 2016 or 2017?</newvalue>
</update>
</changes>'
select
T.C.value('oldvalue[1]', 'nvarchar(max)') as oldvalue,
T.C.value('newvalue[1]', 'nvarchar(max)') as newvalue
from @data.nodes('changes/update') as T(C)
where T.C.value('field[1]', 'nvarchar(max)') = 'assignedto'
如果從表的列中進行選擇,它將類似於
select *
from dbo.updates as U
outer apply
(
select
T.C.value('oldvalue[1]', 'nvarchar(max)') as oldvalue,
T.C.value('newvalue[1]', 'nvarchar(max)') as newvalue
from U.[changes].nodes('changes/update') as T(C)
where T.C.value('field[1]', 'nvarchar(max)') = 'assignedto'
) as CALC
where
CALC.oldvalue is not null
or CALC.newvalue is not null
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.