質問

このxmlの場合(SQL 2005 XML列):

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

SQL Server 2005内の値ではなく、属性の名前(ba、bb、bc、bd)を取得できるようにしたい 。 XPathはname()でこれを確実に許可しますが、SQLはそれをサポートしていません。これは、SQLでXMLを使用することに関する私の主な不満です。 XML / Xpath / XQuery仕様のどの部分がそこにあるかを把握する必要があります。

これを行う唯一の方法は、XMLをXMLドキュメント(iirc)にロードし、XPathを実行してノードの名前を抽出するCLRプロシージャを構築することです。ここで提案を受け付けています。

役に立ちましたか?

解決

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」の場合

返される

  • ba
  • bb
  • bc

xmlの各要素の属性を取得するループを構築できます。

ところで サンプルのXMLは、docタグを閉じるときに閉じる必要があります。

他のヒント

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)

戻り値:

属性値

ba 1

bb 2

bc 3

bd 3

this:

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

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)

返品 ba bb 紀元前 bd

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top