2016-07-19 2 views
2

J'ai une table Process dans la base de données de serveur SQL comme ceci:obtenir la valeur d'attribut du noeud enfant XML avec lequel la condition sur le nœud parent

Proccess Table

colonne workflowXML a des valeurs comme ceci:

<Tasks> 
    <Task type="start" id="Task_038517r"> 
    <TaskUsers> 
     <TaskUser RoleName="User"/> 
    </TaskUsers> 
    </Task> 
    <Task type="final" id="Task_1sytah6"> 
    <TaskUsers> 
     <TaskUser RoleName="Admin"/> 
    </TaskUsers> 
    </Task> 
</Tasks> 

J'ai besoin de SQL requête pour obtenir RoleName en Task nœuds que type de Task est start. Je teste cette requête:

select m.c.value('@RoleName','varchar(max)') as RoleName 
from Process as p 
outer apply 
    p.WorkflowXML.nodes('/Tasks/Task/TaskUsers/TaskUser') as m(c) 
where 
WorkflowXML.exist('/Tasks/Task[@type="start"]') = 1 

mais WorkflowXML.exist est pas correct et retourner tous RoleNames dans les colonnes xml.

Il serait très utile si quelqu'un pouvait expliquer la solution à ce problème.

Merci.

Répondre

3

Il est beaucoup mieux d'inclure votre filtre directement dans le XPath:

select m.c.value('@RoleName','varchar(max)') as RoleName 
from Process as p 
outer apply p.WorkflowXML.nodes('/Tasks/Task[@type="start"]/TaskUsers/TaskUser') as m(c) 

Votre approche avec WHERE pourrait être assez lent avec de plus grandes quantités/structures ...

+0

Simple et sympa! :) – gofr1

1

Vous pouvez modifier WHERE déclaration à ceci:

WHERE m.c.value('../../@type','varchar(max)') = 'start'