1

次の単純化された 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 つの理由から非常に困難であることがわかっています。

  1. <product>3623949 がGroups/Group/Group/Group/(グループの 3 レベル)<product>内に存在するのに対し、3265725 は(Groups/Group/グループの 1 レベル)内に存在することに気付くでしょう。<product><Group>

  2. <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 ソリューションはまた、参考にしてください-私たちは本当にこれでレンガの壁にぶつかりました.

4

1 に答える 1