Bulk verschachtelte XML mit Fremdschlüssel als Identitätsspalte der ersten Tabelle einfügen

Ich habe eine XML wie folgt:

<Records>
  <Record>
    <Name>Best of Pop</Name>
    <Studio>ABC studio</Studio>
    <Artists>
      <Artist>
        <ArtistName>John</ArtistName>
        <Age>36</Age>            
      </Artist> 
      <Artist>
        <ArtistName>Jessica</ArtistName>
        <Age>20</Age>            
      </Artist>
    </Artists>
  </Record>
  <Record>
    <Name>Nursery rhymes</Name>
    <Studio>XYZ studio</Studio>
    <Artists>
      <Artist>
        <ArtistName>Judy</ArtistName>
        <Age>10</Age>            
      </Artist> 
      <Artist>
        <ArtistName>Rachel</ArtistName>
        <Age>15</Age>            
      </Artist>
    </Artists>
  </Record>
</Records>

Diese Datei enthält möglicherweise Millionen von Datensätzen. Meine MS SQL-Datenbank läuft aufAzure SQL Database, enthält die folgenden 2 Tabellen zum Speichern dieser Datensätze:

Record (RecordId [PK, Identität, Auto-Inkrement], Name, Studio)

Artist (RecordId [Fremdschlüssel verweist auf Record.RecordId], ArtistName, Alter)

Ist es möglich, Datensätze als Masseneintrag in das @ einzufügeRecord table, besorge die RecordIds und füge dann die Informationen des Interpreten in dasArtist table in einer einzelnen Durchquerung der XML-Datei unter Verwendung des XML-Nodes-Ansatzes?

Ich habe lange nach einem effizienten Weg gesucht, dies zu tun, aber vergebens.

ch habe ähnliche Ansätze wie die beschriebenen ausprobierHie undHie, aber ich komme nicht zur Lösung.

Alle Hinweise in die Richtung der Lösung werden von großer Hilfe sein.

Aktualisiere: @srutzky: Danke für die Lösung. Das funktioniert genau so wie ich es wollte. Aber es gibt einen Haken. Ich muss den Knotenansatz für die Lösung verwenden. Ich habe den ersten Teil der Abfrage geändert. Aber ich stecke in der 2. Hälfte fest. Folgendes habe ich vor.

DECLARE @Record TABLE (RecordId INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
                       Name NVARCHAR(400) UNIQUE,
                       Studio NVARCHAR(400));
DECLARE @Artist TABLE (ArtistId INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
                       RecordId INT NOT NULL,
                       ArtistName NVARCHAR(400), Age INT);

INSERT INTO @Record (Name, Studio)
   SELECT  T.c.value(N'(Name/text())[1]', 'NVARCHAR(400)'),
           T.c.value(N'(Studio/text())[1]', 'NVARCHAR(400)')
 FROM @ImportData.nodes('/Records/Record') T(c);

SELECT * FROM @Record

Könntest du mir bitte mit dem 2. Teil aushelfen? Ich bin neu in diesem XML-Handling-Ansatz.

UPDATE2: Und ich habe es verstanden ... Ich habe mir ein paar Stunden lang den Kopf zerbrochen, ein paar Dinge ausprobiert und war endlich bei der Lösung.

DECLARE @Record TABLE (RecordId INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
                       Name NVARCHAR(400) UNIQUE,
                       Studio NVARCHAR(400));
DECLARE @Artist TABLE (ArtistId INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
                       RecordId INT NOT NULL,
                       ArtistName NVARCHAR(400), 
                       Age INT);

INSERT INTO @Record (Name, Studio)
   SELECT  T.c.value(N'(Name/text())[1]', 'NVARCHAR(400)'),
           T.c.value(N'(Studio/text())[1]', 'NVARCHAR(400)')
 FROM @ImportData.nodes('/Records/Record') T(c);

INSERT INTO @Artist (RecordId, ArtistName, Age)
    SELECT  (SELECT RecordId FROM @Record WHERE Name=T.c.value(N'(../../Name/text())[1]', 'NVARCHAR(400)')),
            T.c.value(N'(ArtistName/text())[1]', 'NVARCHAR(400)'),
           T.c.value(N'(Age/text())[1]', 'INT')
 FROM @ImportData.nodes('/Records/Record/Artists/Artist') T(c);

 SELECT * FROM @Record
 SELECT * FROM @Artist

@ srutzky: Vielen Dank, dass Sie mich in die richtige Richtung gelenkt haben. Vorschläge zur Verbesserung dieser Lösung sind willkommen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage