我有一个表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字段的记录,但我在选择匹配的旧值和新值时遇到困难。
答案 0 :(得分:3)
您可以从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