SQL XML列の要素から属性の名前を取得します
-
04-07-2019 - |
質問
この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
所属していません StackOverflow