6

对于此 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 以提取节点的名称。我愿意接受这里的建议。

4

4 回答 4

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)

回报:

属性值

巴 1

BB 2

公元前3

BD 3

于 2010-11-11T16:19:42.183 回答
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”

它返回

  • bb
  • 公元前

您可以构建一个循环来获取 xml 中每个元素的属性。

顺便说一句,您的示例中的 XML 应该在关闭 doc 标记时关闭。

于 2008-10-27T23:12:41.543 回答
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

于 2009-11-03T12:43:53.203 回答
1
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 bc bd

于 2018-09-07T10:23:42.447 回答