次の単純化された XML を取り上げます。
(サード パーティ業界の卸売業者データ プロバイダーからの非常に高価な (そして大規模な) XML 製品フィードからの抜粋 - つまり、そのスキーマ / フォーマット / コンテンツを制御することはできません)
<Company>
<Code>7786</Code>
<Brand>
<!-- /../ -->
<Groups>
<Group>
<!-- /../ -->
<Group>
<!-- /../ -->
<Group>
<!-- /../ -->
<Product>
<Pip_code>3623949</Pip_code>
<!-- /../ -->
<Other_Codes>
<Other_Code>
<Code_Description>EAN</Code_Description>
<Code_Value>5013158781351</Code_Value>
</Other_Code>
<Other_Code>
<Code_Description>shipper EAN</Code_Description>
<Code_Value>503158781443</Code_Value>
</Other_Code>
<Other_Code>
<Code_Description>AMPP</Code_Description>
<Code_Value>19192411000001107</Code_Value>
</Other_Code>
<Other_Code>
<Code_Description>AMPP Manf</Code_Description>
<Code_Value>2061801000001104</Code_Value>
</Other_Code>
</Other_Codes>
</Product>
</Group>
</Group>
</Group>
</Groups>
</Brand>
<Brand>
<!-- /../ -->
<Groups>
<Group>
<!-- /../ -->
<Product>
<Pip_code>3265725</Pip_code>
<!-- /../ -->
<Other_Codes>
<Other_Code>
<Code_Description>Outer EAN</Code_Description>
<Code_Value>5013158776531</Code_Value>
</Other_Code>
<Other_Code>
<Code_Description>AMPP</Code_Description>
<Code_Value>11521811000001106</Code_Value>
</Other_Code>
<Other_Code>
<Code_Description>AMPP Manf</Code_Description>
<Code_Value>2061801000001104</Code_Value>
</Other_Code>
<Other_Code>
<Code_Description>EAN</Code_Description>
<Code_Value>5013158776500</Code_Value>
</Other_Code>
</Other_Codes>
</Product>
</Group>
</Groups>
</Brand>
</Company>
私は次の出力を生成することを任されています。
これは、次の 2 つの理由から非常に困難であることがわかっています。
<product>
3623949 がGroups/Group/Group/Group/
(グループの 3 レベル)<product>
内に存在するのに対し、3265725 は(Groups/Group/
グループの 1 レベル)内に存在することに気付くでしょう。<product>
<Group>
<Other_Codes>
内のノードに注意してください<product>
- 繰り返しの子ノード (Code_Description と Code_Value) を 2 つの個別の列として選択する必要がありますが、<Other_Code>
ノード内に任意の数のノードが存在する可能性が<Other_Codes>
あり、それらすべてを選択する必要があることにも注意してください ([i] 表記を役に立たなくする)
TSQL を使用してこのデータを取得するために最善を尽くしましたOPENXML
が、それを行うには、さまざまな Group/Group/ レベルのコードを複製する必要があり、Other_Code の発生回数をハードコーディングする必要があります。 [0] 表記を使用 - これは変数の性質を考慮したものです。間違っている。
SELECT *
FROM OPENXML (@idoc, 'Company/Brand/Groups/Group/Product',2)
WITH (
PIP_code CHAR (20) 'Pip_code',
OtherCodeType CHAR (20) 'Other_Codes/Other_Code[1]/Code_Description',
OtherCodeValue CHAR (30) 'Other_Codes/Other_Code[1]/Code_Value',
OtherCodeType2 CHAR (20) 'Other_Codes/Other_Code[2]/Code_Description',
OtherCodeValue2 CHAR (30) 'Other_Codes/Other_Code[2]/Code_Value',
OtherCodeType3 CHAR (20) 'Other_Codes/Other_Code[3]/Code_Description',
OtherCodeValue3 CHAR (30) 'Other_Codes/Other_Code[3]/Code_Value'
)
これを TSQL で行うことをお勧めします (この XML ファイルは、ここでは関係のない他のノードとパスに対して既に処理されているため)。SQL Server 2008、2008 R2、および SQL Server 2014 を自由に使用できますが、非 SQL ソリューションはまた、参考にしてください-私たちは本当にこれでレンガの壁にぶつかりました.