2009-03-20 8 views
0

je le code XML suivant:SQL Server - OPENXML comment obtenir la valeur d'attribut

<Field FieldRowId="1000"> 
    <Items> 
     <Item Name="CODE"/> 
     <Item Name="DATE"/> 
    </Items> 
</Field> 

J'ai besoin pour obtenir le FieldRowId en utilisant OPENXML. Le SQL j'ai jusqu'ici:

INSERT INTO @tmpField 
     ([name], [fieldRowId]) 
SELECT [Name], --Need to get row id of the parent node 
FROM OPENXML (@idoc, '/Field/Items/Item', 1) 
+0

Comme indiqué dans les balises, vous utilisez SQL Server 2005 qui prend en charge de manière native le type de données XML. Pourquoi n'utilisez-vous pas cela à la place? –

+0

En raison de la limitation de la couche de données dans notre application, le SP ne peut pas utiliser un paramètre d'entrée de type de données xml. Est-il possible de conserver le paramètre d'entrée VARCHAR (MAX) et de le convertir en un type de données XML? – DotnetDude

Répondre

2

EDIT: J'ai ajouté un noeud racine au xml. et a démontré en saisissant l'identité. Je suppose que vous avez plus d'un élément de champ dans le xml. C'est en supposant que vous avez le XML de départ; vous donne-t-on un objet et doit-il traverser vers le haut?

DECLARE @T varchar(max) 
SET @T = 
'<root> 
    <Field FieldRowId="1000"> 
     <Items> 
      <Item Name="CODE"/> 
      <Item Name="DATE"/> 
     </Items> 
    </Field> 
    <Field FieldRowId="2000"> 
     <Items> 
      <Item Name="CODE"/> 
      <Item Name="DATE"/> 
     </Items> 
    </Field> 
</root>' 

DECLARE @X xml 

SET @X = CAST(@T as xml) 
SELECT Y.ID.value('../../@FieldRowId', 'int') as FieldID, 
     Y.ID.value('@Name', 'varchar(max)') as "Name" 
FROM @X.nodes('/root/Field/Items/Item') as Y(ID) 
+0

Donc, si j'ai une fois la variable xml, comment puis-je faire ce que j'essaie d'accomplir? – DotnetDude

+0

Vous pouvez soit l'utiliser directement comme Lurker a montré ou vous pouvez utiliser OPENXML comme je parle de http://searchsqlserver.techtarget.com/tip/0,289483,sid87_gci1347994,00.html. – mrdenny

0

L'utilisation de noeuds est la solution. OPENXML prend 1/8 de la mémoire du serveur SQL chaque fois qu'il est utilisé. Bien que OPENXML et les nœuds auront généralement les mêmes performances de requête.

Questions connexes