Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как Мастер-Деталь в @XML1, потом из @XML1 в Мастер-Деталь  [new]
MaratSH
Member

Откуда: Moscow
Сообщений: 179
Господа, подскажите

Как лучше уложить записи связанных таблиц (одна мастер таблица и несколько деталей) в одну XML переменную, чтобы потом из этой переменной записи снова развернуть в точно такие же таблицы?

Т.е., исходные данные:

+
if object_id('tabDetail1', 'U') is not null
  drop table tabDetail1
if object_id('tabDetail2', 'U') is not null
  drop table tabDetail2
if object_id('tabMaster', 'U') is not null
  drop table tabMaster
go

create table
	tabMaster (fkey int not null primary key, fval varchar(10))
create table
	tabDetail1 (fMasterKey int not null foreign key references tabMaster(fKey), fval1 varchar(10))
create table
	tabDetail2 (fMasterKey int not null foreign key references tabMaster(fKey), fval2 varchar(10))
go

insert into tabMaster
select 1, '111' union all select 2, '222' union all select 3, '333'

insert into tabDetail1
select 1, '111-111' union all select 1, '111-222' union all select 2, '222-111' 
  union all select 2, '222-222' union all select 2, '222-333'

insert into tabDetail2
select 2, '222-111' union all select 2, '222-222' union all select 2, '222-333' 
  union all select 3, '333-111' union all select 3, '333-222'



К примеру, можно получить XML таким способом:

declare @xml xml

select @xml = (
select 
  m.*
, (select * from tabDetail1 for xml path('Det1'), elements, root('Details1'), type)
, (select * from tabDetail2 for xml path('Det2'), elements, root('Details2'), type)
from tabMaster m
for xml path('Mast'), elements, root('Masters'))

Или как-то совсем по другому.

Но как минимальным кодом снова загнать записи из XML в эти же таблицы

Не важно как складывать и разбирать, важно чтобы это была одна XML переменная, и желательно минимум кода.

Заранее спасибо.
15 мар 15, 22:02    [17386958]     Ответить | Цитировать Сообщить модератору
 Re: Как Мастер-Деталь в @XML1, потом из @XML1 в Мастер-Деталь  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
if object_id('tabDetail1', 'U') is not null
  drop table tabDetail1
if object_id('tabDetail2', 'U') is not null
  drop table tabDetail2
if object_id('tabMaster', 'U') is not null
  drop table tabMaster
go

create table
	tabMaster (fkey int not null primary key, fval varchar(10))
create table
	tabDetail1 (fMasterKey int not null foreign key references tabMaster(fKey), fval1 varchar(10))
create table
	tabDetail2 (fMasterKey int not null foreign key references tabMaster(fKey), fval2 varchar(10))
go

insert into tabMaster
select 1, '111' union all select 2, '222' union all select 3, '333'

insert into tabDetail1
select 1, '111-111' union all select 1, '111-222' union all select 2, '222-111' 
  union all select 2, '222-222' union all select 2, '222-333'

insert into tabDetail2
select 2, '222-111' union all select 2, '222-222' union all select 2, '222-333' 
  union all select 3, '333-111' union all select 3, '333-222'
 

select * from tabMaster
select * from tabDetail1
select * from tabDetail2


declare @xml xml
select @xml = 
(select m.fkey,m.fval
, (select fMasterKey,fval1 from tabDetail1 where fMasterKey = m.fkey for xml path('Det1'), elements,  type)
, (select fMasterKey,fval2 from tabDetail2 where fMasterKey = m.fkey for xml path('Det2'), elements,  type)
from tabMaster m
for xml path('Mast'), elements, root('Masters'))


truncate table tabDetail1
truncate table tabDetail2
delete from tabMaster


insert into tabMaster(fkey,fval)
select 
 c.value('fkey[1]','int') as fkey
,c.value('fval[1]','varchar(50)') as fval
from @xml.nodes('//Mast') t(c)

insert into tabDetail1(fMasterKey,fval1)
select 
 c.value('fMasterKey[1]','int') as fMasterKey
,c.value('fval1[1]','varchar(50)') as fval1
from @xml.nodes('//Det1') t(c)

insert into tabDetail2(fMasterKey,fval2)
select 
 c.value('fMasterKey[1]','int') as fMasterKey
,c.value('fval2[1]','varchar(50)') as fval2
from @xml.nodes('//Det2') t(c)


select * from tabMaster
select * from tabDetail1
select * from tabDetail2
16 мар 15, 07:24    [17387465]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить