我有一个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
答案 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