对于此xml(在SQL 2005 XML列中):
<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不支持。这是我在SQL中使用XML的主要抱怨;你必须弄清楚XML / Xpath / XQuery规范的哪些部分。
我能想到的唯一方法是构建一个CLR proc,它将XML加载到XML Document(iirc)中并运行XPath来提取节点的名称。我愿意接受这方面的建议。
答案 0 :(得分:7)
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
答案 1 :(得分:5)
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中每个元素的属性。
顺便说一句 应在关闭doc标签时关闭样本中的XML。
答案 2 :(得分:3)
这样:
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
答案 3 :(得分:0)
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