2

我有以下 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

希望有人可以提供帮助-谢谢。

4

1 回答 1

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
于 2013-07-03T08:32:37.360 回答