Во-первых, позвольте мне сказать, что SSIS - ваш лучший выбор. Но, чтобы ответить на вопрос, который вы задали ...
Я не верю, что вам удастся избежать создания новых идентификаторов повсюду, хотя вы могли бы, но вам нужно будет взять исходные идентификаторы для поиска.
Лучшее, что вы можете получить - это один оператор вставки для таблицы. Вот пример кода, который нужно сделать SELECT
s, чтобы получить данные из вашего образца XML:
declare @xml xml
set @xml='<People Key="1" FirstName="Bob" LastName="Smith">
<PeopleAddresses PeopleKey="1" AddressesKey="1">
<Addresses Key="1" Street="123 Main" City="St Louis" State="MO" ZIP="12345" />
</PeopleAddresses>
</People>
<People Key="2" FirstName="Harry" LastName="Jones">
<PeopleAddresses PeopleKey="2" AddressesKey="2">
<Addresses Key="2" Street="555 E 5th St" City="Chicago" State="IL" ZIP="23456" />
</PeopleAddresses>
</People>
<People Key="3" FirstName="Sally" LastName="Smith">
<PeopleAddresses PeopleKey="3" AddressesKey="1">
<Addresses Key="1" Street="123 Main" City="St Louis" State="MO" ZIP="12345" />
</PeopleAddresses>
</People>
<People Key="4" FirstName="Sara" LastName="Jones">
<PeopleAddresses PeopleKey="4" AddressesKey="2">
<Addresses Key="2" Street="555 E 5th St" City="Chicago" State="IL" ZIP="23456" />
</PeopleAddresses>
</People>
'
select t.b.value('./@Key', 'int') PeopleKey,
t.b.value('./@FirstName', 'nvarchar(50)') FirstName,
t.b.value('./@LastName', 'nvarchar(50)') LastName
from @xml.nodes('//People') t(b)
select t.b.value('../../@Key', 'int') PeopleKey,
t.b.value('./@Street', 'nvarchar(50)') Street,
t.b.value('./@City', 'nvarchar(50)') City,
t.b.value('./@State', 'char(2)') [State],
t.b.value('./@Zip', 'char(5)') Zip
from
@xml.nodes('//Addresses') t(b)
Для этого нужно взять узлы из XML и проанализировать данные. Чтобы получить реляционный идентификатор от людей, мы используем ../../, чтобы идти вверх по цепочке.