从xml datacolumn中选择属性作为行

时间:2014-12-03 08:31:14

标签: sql sql-server xml

我有一个xml列,其中包含简单的xml,如

<Data att1="test1" att123="test123" />

我需要这样的形式:

IdRow attributeName attributeValue
1     att1          test1
1     att123        test123

尝试使用节点和查询函数,但它适用于元素但不适用于属性...可以在不将属性转换为元素的情况下完成吗?

编辑:我可以获取属性值但是如何获取每行的属性名称?

EDIT2:解决了这个问题,这里有函数local-name。

SELECT T.id, T2.Att.value('local-name(.)', 'varchar(50)'), T2.Att.value('.', 'nvarchar(max)')
FROM  T
CROSS APPLY DataXml.nodes('/Data/@*') as T2(Att) 
where T.id = 354

2 个答案:

答案 0 :(得分:0)

这很简单:

  SELECT T.id, T2.Att.value('local-name(.)', 'varchar(50)'), T2.Att.value('.', 'nvarchar(max)')
    FROM  T
    CROSS APPLY DataXml.nodes('/Data/@*') as T2(Att) 
    where T.id = 354

答案 1 :(得分:0)

你可以写成:

DECLARE @xml as xml
DECLARE @path as varchar(max)
DECLARE @index int, @count int

SET @xml = 
'<Data att1="test1" att123="test123" />'



SELECT @index = 1

SET @count = @xml.query('count(/Data/@*)').value('.','int')

WHILE @index <= @count 
BEGIN
    SELECT  @xml.value('local-name((/Data/@*[sql:variable("@index")])[1])',
            'varchar(max)')
    SET @index = @index + 1
END