Получить имена атрибутов из элемента в столбце SQL XML - PullRequest
6 голосов
/ 28 октября 2008

Для этого xml (в столбце XML SQL 2005):

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

Я бы хотел иметь возможность получать имена атрибутов (ba, bb, bc, bd), а не значения внутри SQL Server 2005 . Конечно, XPath допускает это с помощью name (), но SQL этого не поддерживает. Это моя главная жалоба на использование XML в SQL; Вы должны выяснить, какие части спецификации XML / Xpath / XQuery находятся там.

Единственный способ сделать это - создать CLR-процесс, который загружает XML в XML-документ (iirc) и запускает XPath для извлечения имен узлов. Я открыт для предложений здесь.

Ответы [ 4 ]

7 голосов
/ 11 ноября 2010
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)

Возвращает:

Значение атрибута

ба 1

bb 2

до н.э. 3

бд 3

5 голосов
/ 28 октября 2008
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

для элемента 'b'

возвращает

  • ба
  • бб
  • Ьс

Вы можете построить цикл для получения атрибутов для каждого элемента в XML.

КСТАТИ XML в вашем образце должен быть закрыт при закрытии тега doc.

3 голосов
/ 03 ноября 2009

это:

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

возвращается:

ba bb bc

0 голосов
/ 07 сентября 2018
Declare @xml Xml = '<doc><a>1</a><b ba="1" bb="2" bc="3" /><c bd="3"/></doc>'

Select n.value('local-name(.)', 'varchar(max)')  from @xml.nodes('/doc/*/@*') a(n)

Возвращает ба бб До нашей эры шд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...