2008-10-27 35 views
5

對於這個XML(在SQL 2005 XML列):獲取屬性的名稱在SQL 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規範的哪些部分在那裏。

我能想到的要做到這一點的唯一方法是建立加載XML爲XML文檔(IIRC),並運行XPath來提取節點的名稱的CLR PROC。我在這裏接受建議。

+1

哇,這有一個給予好評**7.5年**我問後。 – jcollum 2016-07-15 22:29:30

回答

4
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中。

BTW 你的樣品中的XML應在關閉文檔標籤被關閉。

+0

我認爲這是無法完成的。謝謝! – jcollum 2008-10-28 19:05:17

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

6
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

公元前3

BD 3