2016-05-26 6 views
0

テーブルupdatesがあり、各行にはid列とchangesというXML列があります。私はnewvalueおよび各レコードのoldvaluefield = "AssignedTo"の値を見つけたい特定のxml要素のテキスト値を取得するSQL ServerのXpath

<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> 

:のように、各行のXML列には値があります。

AssignedToフィールドは各レコードのXMLに1度しか表示されません。

これまでのところ私はAssignedToフィールドとレコードのみを返すには

where [changes].exist('/changes/update/field/text() [contains(.,"assignedto")]') 

を使用しましたが、私はマッチング古い値と新しい値を選択する難しさを抱えています。

答えて

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 
+0

はそれをどのように適用するかを聞いてちょうど約だったように、それは何かになりますあなたは私にそれを打つ。ありがとう – Jammy

関連する問題