2

しばらくの間、XML を使用して大量のデータを SQL にインポートしてきましたが、子ノードを持つ単一の XML ファイルから複数のテーブルにわたってデータをインポートできるかどうか疑問に思っています。

この例を考えると:

DECLARE @tbl_makes TABLE (ID int IDENTITY(1,1), makeName nvarchar(100))
INSERT INTO @tbl_makes (makeName) VALUES ('Ford') 
INSERT INTO @tbl_makes (makeName) VALUES ('Jaguar') 

DECLARE @tbl_models TABLE (ID int IDENTITY(1,1), makeID int, modelName nvarchar(100))
INSERT INTO @tbl_models (makeID, modelName) VALUES (1, 'Escort')
INSERT INTO @tbl_models (makeID, modelName) VALUES (1, 'Sierra')
INSERT INTO @tbl_models (makeID, modelName) VALUES (2, 'XK')
INSERT INTO @tbl_models (makeID, modelName) VALUES (2, 'XJS')

SELECT * FROM @tbl_makes m INNER JOIN @tbl_models md ON m.ID = md.makeID 

DECLARE @xml XML = '
<cars>
    <make name="Ford">
        <model name="Mustang" />
        <model name="Taurus" />
        <model name="F350" />
    </make>
    <make name="Aston Martin">
        <model name="Vanquish" />
        <model name="DB7" />
        <model name="Lagonda" />
    </make>
</cars>'

関連データを挿入する前に、最初にメーカー名を挿入/検索する必要があることを理解しています。これに対する回答をオンラインで検索しましたが、例では単一のテーブルしか使用していません。いろいろな一時テーブルを使わないと無理だとは思いますが、こうなります...

4

1 に答える 1

6

そのような解決策はどうですか?

INSERT INTO @tbl_makes (makeName)
SELECT i.i.value('@name', 'nvarchar(100)')
FROM @xml.nodes('/cars[1]/make')i(i)
LEFT JOIN @tbl_makes MA on i.i.value('@name', 'nvarchar(100)') = MA.makeName
WHERE MA.ID IS NULL;

INSERT INTO @tbl_models (makeID, modelName)
SELECT MA.ID, j.j.value('@name', 'nvarchar(100)')
FROM @xml.nodes('/cars[1]/make')i(i)
INNER JOIN @tbl_makes MA ON i.i.value('@name', 'nvarchar(100)') = MA.makeName
CROSS APPLY i.i.nodes('model')j(j)
LEFT JOIN @tbl_models MO on j.j.value('@name', 'nvarchar(100)') = MO.modelName
WHERE MO.ID IS NULL;
于 2013-09-25T12:17:38.820 に答える