Я не собираюсь писать это для каждого поля и всех вставок, но следующий SQL должен указать вам правильное направление:
declare @xml xml
set @xml =
'
<StateTree>
<State ID="01">
<Name>State1</Name>
<CityList>
<City ID="01" Order="1" CityGroup="1" CityBuild="1" GeoLocation="X">
<Name>City1</Name>
<Group>1</Group>
<AreaList>
<Area ID="01" GeoLocation="6">
<Name>Area1</Name>
</Area>
<Area ID="02" GeoLocation="6">
<Name>Area2</Name>
</Area>
</AreaList>
</City>
<City ID="02" Order="3" CityGroup="2" CityBuild="4" GeoLocation="5">
<Name>City2</Name>
<Group>2</Group>
<AreaList />
</City>
</CityList>
</State>
</StateTree>
'
--Select States
select
ID = s.value('@ID','varchar(10)'),
Name = s.value('Name[1]','varchar(100)')
from
@xml.nodes('/StateTree/State') x(s)
--Select Cities
select
ID = c.value('@ID','varchar(10)'),
Name = c.value('Name[1]','varchar(100)'),
StateID = c.value('../../@ID','varchar(10)')
from
@xml.nodes('/StateTree/State/CityList/City') x(c)
--Select Areas
select
ID = a.value('@ID','varchar(10)'),
Name = a.value('Name[1]','varchar(100)'),
CityID = a.value('../../@ID','varchar(10)')
from
@xml.nodes('/StateTree/State/CityList/City/AreaList/Area') x(a)