2008-10-27 38 views
5

Đối với xml này (trong một cột XML SQL 2005):Lấy tên của thuộc tính từ một yếu tố trong một cột SQL XML

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

Tôi muốn để có thể lấy tên của các thuộc tính (ba, bb, bc, bd) thay vì các giá trị bên trong SQL Server 2005. Vâng, XPath chắc chắn cho phép điều này với tên() nhưng SQL không hỗ trợ điều đó. Đây là khiếu nại chính của tôi khi sử dụng XML trong SQL; bạn phải tìm ra phần nào của thông số XML/Xpath/XQuery nằm trong đó.

Cách duy nhất tôi có thể nghĩ để làm điều này là xây dựng một CLR proc tải XML vào một tài liệu XML (iirc) và chạy XPath để trích xuất tên của các nút. Tôi đang mở để gợi ý ở đây.

+1

Wow này có một phiếu bầu tán thành ** 7,5 năm ** sau khi tôi hỏi nó. – jcollum

Trả lời

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 

cho các phần tử 'b'

nó trả

  • ba
  • bb
  • bc

Bạn có thể xây dựng một vòng lặp để có được thuộc tính cho mỗi phần tử trong xml.

BTW XML trong mẫu của bạn phải được đóng khi đóng thẻ doc.

+0

Tôi nghĩ rằng nó không thể được thực hiện. Cảm ơn! – jcollum

3

này:

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)') 

lợi nhuận:

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) 

Returns:

Attribute Value

ba 1

bb 2

bc 3

bd 3

Các vấn đề liên quan