1

T-SQL で xml 変数を反復処理し、各エンティティの xmlを順番に取得する一般的な方法はありますか?

DECLARE @xml xml = 
'<Entities>
<Entity key="4" attrib1="abc" attrib2="def" />
<Entity key="18" attrib1="ghi" attrib2="jkl" />
<Entity key="938" attrib1="mno" />
</Entities>'

たとえば、上記の XML には、Entity のインスタンスが 3 つあります。それぞれの XML が順番に必要です。これは、ハードコードされた方法で行うことができます。

SELECT @entityxml = @xml.query('/Entities/Entity[1]')

戻ります

    <Entity key="4" attrib1="abc" attrib2="def" />

次に、[2] に変更して次の値を取得できます。

しかし、BOL と実験の両方によると、@xml.query へのパラメーターは文字列リテラルでなければなりません。つまり、変数をパラメータとして使用することはできず、[1]、[2] などで変数を構築し、いくつものエンティティを取得します。クエリをハードコーディングしたようで、見苦しいコードになっています。

他の方法を使用して xml 内のデータをテーブルに取得し、テーブル内の行を反復処理できることを知っています。XML 自体を取得すること、つまり、上記の @xml.query に相当するものを取得することについて具体的に質問していますが、配列値をハードコードすることなく取得できます。

ありがとう!

4

2 に答える 2

3

position()を使用して、インデックスに基づいて要素を選択できます。

DECLARE @xml xml = 
'<Entities>
<Entity key="4" attrib1="abc" attrib2="def" />
<Entity key="18" attrib1="ghi" attrib2="jkl" />
<Entity key="938" attrib1="mno" />
</Entities>'

declare @i int;
set @i = 2;

select @xml.query('Entities/Entity[position()=sql:variable("@i")]');
于 2013-05-11T00:58:51.497 に答える
0

このようなものはトリックを行います:

DECLARE @xml xml = 
'<Entities>
<Entity key="4" attrib1="abc" attrib2="def" />
<Entity key="18" attrib1="ghi" attrib2="jkl" />
<Entity key="938" attrib1="mno" />
</Entities>';

SELECT @xml.query('
for $i in //Entity
return
<Entity>
    { $i/@key }
    { $i/@attrib1 }
    { $i/@attrib2 }
</Entity>
');
于 2013-05-10T22:29:04.543 に答える