2010-10-26 5 views
1

Je travaille avec le code XML suivantUtilisation d'une variable dans un SQL Server 2005 procédure stockée avec XQuery

<AEDControl ControlGU="17fed98c-8128-4c6b-9b50-3dbe73889b9d" 
      ControlLabel="Posting Status" 
      TypeGU="6b4d08b1-6340-450c-beae-517b7d84e717" 
      ControlDescription=""> 
    <Elements> 
    <Element ElementGU="2da346d1-2e05-4aa3-9bae-5aa9b3b75d5c" 
      Label="Active" 
      IsDefault="false"/> 
    <Element ElementGU="fa8966fc-c796-4482-9ee1-f619910dc86e" 
      Label="Closed" 
      IsDefault="false"/> 
    <Element ElementGU="d701a7d7-c3bd-496b-8d4b-b854a6937c3a" 
      Label="Filled" 
      IsDefault="false"/> 
    <Element ElementGU="75af1941-f14f-4b7e-9f1e-5b6852c4a4f7" 
      Label="New" 
      IsDefault="false"/> 
    <Element ElementGU="aa54e387-608e-4758-b4f2-c1dc485a5576" 
      Label="Pending" 
      IsDefault="true"/> 
    <Element ElementGU="210aef5c-e4cf-4987-815f-0e4274b45e08" 
      Label="Scratch" 
      IsDefault="false"/> 
</Elements> 

J'essaie d'interroger à partir d'une procédure stockée pour retirer une étiquette l'élément qui a un ElementGU

spécifique Ma procédure stockée ressemble à ceci:

SELECT 
    CAST(CONTROL_XML.query('data(/AEDControl/Elements/Element/@Label)') as varchar(100)) as ControlLabel 
FROM 
    Control 
WHERE 
    CONTROL_XML.exist('/AEDControl/Elements/Element[@ElementGU = sql:variable("@SelectedValueGU")]') = 1 

ElementGU est passé dans le champ uniqueidentifier.

Je semble ne pas avoir de chance avec ça. J'ai lu que vous ne pouvez pas faire ce type de requête dynamique avec XQuery, mais en même temps, l'appel slq: variable() fait partie de XQuery, donc y a-t-il quelqu'un qui peut me l'expliquer? Je suis encore relativement nouveau sur le front XQuery.

Répondre

1

Vous devez aborder ce un peu différemment: puisque vous avez une liste de <Element> nœuds, je vous suggère de créer une liste de nœuds, puis choisir le bon de cette liste - quelque chose comme ceci:

SELECT 
    AED.Element.value('(@Label)[1]', 'varchar(100)') as ControlLabel 
FROM 
    Control 
CROSS APPLY 
    Control_XML.nodes('/AEDControl/Elements/Element') AS AED(Element) 
WHERE 
AED.Element.value('(@ElementGU)[1]', 'uniqueidentifier') = @SelectedValueGU 

Je ne sais pas comment vous voulez sélectionner votre table de base - si vous voulez avoir une clause WHERE ou quelque chose - mais le CROSS APPLY prend essentiellement le champ XML et crée une "pseudo-table" appelée AED.Element donné dans l'expression XPath, et les applique de façon croisée à la table de base. Alors maintenant, pour chaque entrée dans Control et chaque nœud <Element> dans ces lignes, vous obtenez une ligne de données.

Dans cette ligne, vous pouvez maintenant choisir les lignes où la valeur @ElementGU correspond à la valeur que vous avez passé dans et pour les noeuds XML où cela est le cas, vous sélectionnez alors la valeur de l'attribut @Label

0

Je pense que cette XPath (avec la fonction d'extension sql:variable()) devrait fonctionner:

/AEDControl 
/Elements 
    /Element[@ElementGU = sql:variable("@SelectedValueGU")] 
    /@Label 
Questions connexes