我有以下XML变量:
DECLARE @XML1 xml
SET @XML1 = '
<updates>
<a RowID="1" StatusTypeID="800" Name="Name800" />
<a RowID="2" StatusTypeID="700" Name="Name700" />
<a RowID="3" StatusTypeID="500" Name="Name500" />
</updates>'
我有T-SQL代码,它将提取属性名称和值:
SELECT CAST(Attribute.Name.query('local-name(.)') AS varchar(100)) AS Attribute,
Attribute.Name.value('.', 'varchar(100)') AS Value
FROM @XML1.nodes('//@*') Attribute(Name)
这会产生:
Attribute Value
RowID 1
StatusTypeID 800
Name Name800
RowID 2
StatusTypeID 700
Name Name700
RowID 3
StatusTypeID 500
Name Name500
如何调整输出,以便将与每个节点关联的RowID作为单独的列添加,即我想要的结果是:
Attribute Value RowID
RowID 1 1
StatusTypeID 800 1
Name Name800 1
RowID 2 2
StatusTypeID 700 2
Name Name700 2
RowID 3 3
StatusTypeID 500 3
Name Name500 3
希望有人可以提供帮助 - 谢谢。
答案 0 :(得分:0)
根据您的要求,下面的解决方案可能有点复杂,但好的部分是它有效。
DECLARE @XML1 xml
SET @XML1 = '
<updates>
<a RowID="1" StatusTypeID="800" Name="Name800" />
<a RowID="2" StatusTypeID="700" Name="Name700" />
<a RowID="3" StatusTypeID="500" Name="Name500" />
</updates>'
CREATE TABLE #T
(
ID BIGINT Identity(1,1) PRIMARY KEY, Attribute VARCHAR(50), Value VARCHAR(500), RowID INT
)
insert into #t (attribute,value,RowID)
SELECT CAST(Attribute.Name.query('local-name(.)') AS varchar(100)) AS Attribute,
Attribute.Name.value('.', 'varchar(100)') AS Value, 0 AS RowID
FROM @XML1.nodes('//@*') Attribute(Name)
declare @a INT
select @a = min ( value) from #t where attribute = 'RowID'
update #t
set @a = CASE WHEN attribute = 'RowID' THEN Value ELSE @a END, RowID = @a
select Attribute,Value,RowID from #t
drop table #t