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 に答える