深刻なXmlを細断処理した後、ほぼ必要なものが得られましたが、結果を確認したところ、解析の1つのセクションで、次のすべての行の詳細を反復するこのパターンを簡単に解決できないことがわかりました。各サブヘッダー(たとえば、すべてのラインアイテムに対して合計3つのレコードを書き出すのではなく、サブヘッダーごとに3つのラインアイテムを書き出す)のうち、2つあるとします。全部で6つになります!:-(次のコードでは、パターンを一般的なヘッダー/サブヘッダー/詳細関係モデルとして抽出しました。
DECLARE @MetroXML xml
SET @MetroXML =
'<Header>
<col1>Conoco</col1>
<col2>ORD-1111</col2>
<SubHeaders>
<SubHeader>
<col1>Dallas</col1>
<col2>BOL-2213</col2>
<Details>
<Detail>
<col1>Diesel</col1>
<col2>7600.00</col2>
</Detail>
</Details>
</SubHeader>
</SubHeaders>
<SubHeaders>
<SubHeader>
<col1>Fort Worth</col1>
<col2>BOL-2216</col2>
<Details>
<Detail>
<col1>Ethanol</col1>
<col2>1852.00</col2>
</Detail>
<Detail>
<col1>Unleaded</col1>
<col2>900.00</col2>
</Detail>
</Details>
</SubHeader>
</SubHeaders>
</Header>';
INSERT INTO [scratch].GenericHeader
SELECT T.c.value('col1[1]','varchar(10)') AS 'col1',
T.c.value('col2[1]','varchar(10)') AS 'col2'
FROM @MetroXML.nodes('/Header') T(c);
INSERT [scratch].GenericSubHeader
(id,col1,col2)
SELECT
h.id,
n.x.value('col1[1]','varchar(10)') AS 'col1',
n.x.value('col2[1]','varchar(10)') AS 'col2'
FROM [scratch].GenericHeader h
CROSS APPLY @MetroXML.nodes('/Header/SubHeaders/SubHeader') n(x);
INSERT [scratch].GenericDetail
(id,subid,col1,col2)
SELECT
s.id,
s.subid,
n.x.value('col1[1]','varchar(10)') AS 'col1',
n.x.value('col2[1]','varchar(10)') AS 'col2'
FROM [scratch].GenericSubHeader s
CROSS APPLY @MetroXML.nodes('/Header/SubHeaders/SubHeader/Details/Detail') as n(x);
select * from [scratch].GenericHeader
where id = 24;
select * from [scratch].GenericSubHeader
where id = 24;
select * from [scratch].GenericDetail
where id = 24;
注:id、subid、detidはINT IDENTITY(1,1)の結果として定義されます
私が得るもの:
id|subid|detid|col1 |col2
--------------------------------
24|44 |22 |Diesel |7600.00
24|44 |23 |Ethanol |1852.00
24|44 |24 |Unleaded |900.00
24|48 |25 |Diesel |7600.00
24|48 |26 |Ethanol |1852.00
24|48 |27 |Unleaded |900.00
私が欲しいもの:
id|subid|detid|col1 |col2
--------------------------------
24|44 |22 |Diesel |7600.00
24|48 |23 |Ethanol |1852.00
24|48 |24 |Unleaded |900.00