2008-10-27 12 views
5

Do tego xml (w kolumnie XML, SQL 2005):Get nazwy atrybutów z element w kolumnie SQL XML

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

Chciałbym, aby móc pobierać nazwy atrybutów (ba, bb, bc, bd) zamiast wartości wewnątrz SQL Server 2005. Cóż, XPath na pewno pozwala na to z nazwą(), ale SQL tego nie obsługuje. To jest moja główna skarga z użyciem XML w SQL; musisz dowiedzieć się, które części specyfikacji XML/Xpath/XQuery tam są.

Jedyny sposób, w jaki mogę to zrobić, to zbudować proces CLR, który ładuje XML do dokumentu XML (iirc) i uruchamia XPath, aby wyodrębnić nazwy węzłów. Jestem otwarty na sugestie tutaj.

+1

Wow, to dostał upvote ** ** 7,5 roku po poprosiłem go. – jcollum

Odpowiedz

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 

dla elementu 'b'

to powraca

  • ba
  • bb
  • bc

można zbudować pętlę uzyskać atrybutów dla każdego elementu w xml.

BTW Kod XML w twojej próbce powinien zostać zamknięty przy zamykaniu tagu doc.

+0

Myślałem, że nie da się tego zrobić. Dzięki! – jcollum

3

następująco:

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)') 

powraca:

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) 

Powroty:

Atrybut Wartość

ba 1

bb 2

bc 3

bd 3