У меня есть XML выглядит следующим образом:Массовой вставки вложенные XML с внешним ключом как столбец идентификации первой таблицы
<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>
Этого файл может содержать миллионы записей. Мой MS SQL базы данных, работающие на Azure SQL Database, имеет следующие 2 таблицы для хранения этих записей:
Record
(RecordId [PK, идентичность, автоинкрементным], имя, студия)Artist
(RecordId [внешний ключ ссылается Record.RecordId], ArtistName, Возраст)
можно ли насыпных вставки записей в Record
таблицу, найдите RecordIds, а затем объем вставки информации художника в к таблице Artist
в одном обходе xml с использованием подхода узлов xml?
Я искал эффективный способ сделать это в течение длительного времени, но напрасно.
Я пробовал подходы, подобные описанным here и here, но я не могу добраться до решения.
Любые указатели в направлении решения будут очень полезны.
Обновление: @srutzky: Спасибо за решение. Это работает точно так, как я хотел. Но есть один улов. Я должен использовать подход узлов для решения. Я изменил первую часть запроса. Но я застрял во второй половине. Вот что я получил.
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
Не могли бы вы помочь мне со второй частью? Я новичок в этом подходе к обработке xml.
UPDATE2: И у меня это получилось .... Я несколько раз ломал себе мозги, пробовал несколько вещей и, наконец, пришел к решению.
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: Спасибо за то, что указали мне в правильном направлении. Любые предложения по улучшению этого решения приветствуются.
Зачем вам это нужно в один проход? Также, пожалуйста, покажите нам, что у вас уже есть. – RBarryYoung
Is элемент в пределах уникальный? –
@srutzky: Да, имя уникально. – nikhil