2008-10-27 10 views
5

Pour ce xml (dans une colonne XML SQL 2005):Obtenez les noms des attributs d'un élément dans une colonne SQL XML

<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
<doc> 

Je voudrais être en mesure de récupérer les noms des attributs (ba, bb, bc, bd) plutôt que les valeurs dans SQL Server 2005. Eh bien, XPath le permet avec name() mais SQL ne le supporte pas. Ceci est ma principale plainte avec l'utilisation de XML en SQL; vous devez déterminer quelles parties de la spécification XML/Xpath/XQuery sont présentes. La seule façon que je peux penser à faire est de construire un proc CLR qui charge le XML dans un document XML (iirc) et exécute le XPath pour extraire les noms des noeuds. Je suis ouvert aux suggestions ici.

+1

Wow cela a un upvote ** 7,5 ans ** après je l'ai demandé. – jcollum

Répondre

4
DECLARE @xml as xml 
DECLARE @path as varchar(max) 
DECLARE @index int, @count int 

SET @xml = 
'<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
</doc>' 



SELECT @index = 1 

SET @count = @xml.query('count(/doc/b/@*)').value('.','int') 

WHILE @index <= @count 
BEGIN 
    SELECT @xml.value('local-name((/doc/b/@*[sql:variable("@index")])[1])', 'varchar(max)') 
    SET @index = @index + 1 
END 

élément 'b'

retourne

  • ba
  • bb
  • bc

Vous pouvez construire une boucle pour obtenir les attributs pour chaque élément dans le xml.

BTW Le code XML de votre échantillon doit être fermé lors de la fermeture de la balise doc.

+0

Je pensais que cela ne pouvait pas être fait. Merci! – jcollum

3

ceci:

declare @xml as xml 

set @xml = 
'<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
</doc>' 

select @xml.query(' 
    for $attr in /doc/b/@* 
    return local-name($attr)') 

retours:

ba bb bc

6
DECLARE @xml as xml 

SET @xml = 
'<doc> 
<a>1</a> 
<b ba="1" bb="2" bc="3" /> 
<c bd="3"/> 
</doc>' 

SELECT DISTINCT 
CAST(Attribute.Name.query('local-name(.)') AS VARCHAR(100)) Attribute, 
Attribute.Name.value('.','VARCHAR(100)') Value 
FROM @xml.nodes('//@*') Attribute(Name) 

Retours:

Attribut Valeur

ba 1

bb 2

bc 3

3 bd