2014-12-03 59 views
0

我有一个简单的XML XML列像选择属性从XML的DataColumn行

<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 

回答

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 
0

它occures是如此简单:

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