1

XML ドキュメントからデータを選択していますが、各子ノードをループしていくつかのアクションを実行する必要があります。

現在、select の周りに while exists ループがありますが、ノード番号をパラメータ化する方法がわかりません。

以下が正しくないことは理解していますが、ノード選択をパラメータ化する最良の方法を誰かが指摘できれば幸いです。

ありがとう。

DECLARE @nodeCount varchar(1) = '1'
WHILE EXISTS (SELECT table.value('(Info/Data/DataInfo/Type/node())[' + @nodeCount + ']', 'nvarchar(10)') from table)

XML は次のとおりです。

<Info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Data>
<DataInfo>
  <Description>11111111111</Description>     
  <Type>1</Type>
</DataInfo>
<DataInfo>
  <Description>2222222222222</Description>     
  <Type>2</Type>
</DataInfo>
<DataInfo>
  <Description>3333333333333</Description>    
  <Type>3</Type>
</DataInfo>
</Data>
</Info>
4

1 に答える 1

2

nodes()関数を使用すると、1 つのクエリですべてのデータを取得できます。

select
    t.c.value('(text())[1]', 'nvarchar(10)') as [Type]
from @xml.nodes('/Info/Data/DataInfo/Type') as t(c)

sql fiddle demo

または、本当にループしたい場合は、sql:variable()拡張関数を使用できます。

DECLARE @nodeCount int = 1
WHILE EXISTS (SELECT table.value('(Info/Data/DataInfo/Type/node())[sql:variable("@nodeCount")][1]', 'nvarchar(10)') from table)

sql fiddle demo

于 2013-10-04T08:11:16.313 に答える