オンラインでもう少し調べた後、自分の質問に答えたようです:
SELECT
grandparent.gname.value('@name', 'VARCHAR(15)'),
parent.pname.value('@name', 'VARCHAR(15)'),
child.cname.value('@name', 'VARCHAR(15)')
FROM
@xmlFamilyTree.nodes('/grandparent') AS grandparent(gname)
CROSS APPLY
grandparent.gname.nodes('*') AS parent(pname)
CROSS APPLY
parent.pname.nodes('children/*') AS child(cname)
CROSS APPLY
の使用 トップレベルのgrandparent
を選択できます ノードを作成し、これを使用して子のparent
を選択します ノードなど。このメソッドを使用して、クエリの実行を約1分30秒で実行しました。 約6秒まで 。
興味深いことに、「古い」OPEN XML
を使用すると 同じデータを取得するメソッドの場合、クエリは1秒で実行されます !
渡されるドキュメントの予想されるサイズ/複雑さに応じて、ケースバイケースでこれら2つの手法の使用にアプローチする必要があるようです。