2012-04-30 4 views
0

J'ai besoin d'aide supplémentaire pour une autre requête XML. Voici un exemple d'enregistrement de ma colonne XML:Requête XML SQL Server 2008

<Fields> 
    <MappedFields> 
    <Field name="FormNumber" value="21" /> 
    <Field name="ProcedureCode" value="T2023" /> 
    <Field name="CurrentDate" value="4/23/2012" /> 
    </MappedFields> 
</Fields> 

Les éléments de champ peuvent apparaître dans un ordre quelconque, il peut apparaître comme celui-ci ainsi:

<Fields> 
    <MappedFields> 
    <Field name="ProcedureCode" value="G5532" /> 
    <Field name="FormNumber" value="12" /> 
    <Field name="CurrentDate" value="3/29/2011" /> 
    </MappedFields> 
</Fields> 

Ce que je cherche, est une requête qui obtiendra la valeur du champ avec le nom "FormNumber" pour tous les enregistrements de la table. La requête que j'ai ci-dessous fonctionne si le champ avec le nom de "FormNumber" est le premier élément de champ dans le XML. Ce dont j'ai besoin, c'est d'une requête qui trouvera l'élément Field même s'il ne s'agit pas du premier élément. Est-ce que quelqu'un peut m'aider avec ça?

SELECT 
    X.Node.value(N'(Field/@value)[1]', 'nvarchar(max)') AS FormNumber 
FROM 
    dbo.MHTCM_LetterSent A 
CROSS APPLY A.LetterXML.nodes(N'/Fields/MappedFields') AS X(Node) 
WHERE 
    X.Node.value(N'(Field/@name)[1]', 'nvarchar(max)') = 'FormNumber' 

Répondre

2

Vous pouvez effectuer un test dans le chemin XML comme [@name="FormNumber"].

SELECT 
    X.Node.value(N'(Field[@name="FormNumber"]/@value)[1]', 'nvarchar(max)') AS FormNumber 
FROM 
    dbo.MHTCM_LetterSent A 
CROSS APPLY A.LetterXML.nodes(N'//Fields/MappedFields') AS X(Node) 

Notez que le WHERE n'est pas nécessaire maintenant.

Il serait plus logique de passer le test à la CROSS APPLY:

SELECT 
    X.Node.value(N'(./@value)[1]', 'nvarchar(max)') AS FormNumber 
FROM 
    dbo.MHTCM_LetterSent A 
CROSS APPLY A.LetterXML.nodes(N'//Fields/MappedFields/Field[@name="FormNumber"]') AS X(Node) 

Modifier- J'ai fait les chemins absolus (//) et les deux exemples travaillent pour moi.

+0

C'est une bonne information à noter. Cependant, il ne sélectionne toujours l'élément Field que s'il est le premier. Je voudrais le sélectionner s'il est dans n'importe quel ordre. –

+0

Je m'attendrais à ce qu'il sélectionne le premier élément Field où name = "FormNumber" même s'il ne s'agit pas du premier champ. Voir édition pour prendre 2. – Andrew

+0

Nice! Cela a résolu le problème pour moi! Merci! –