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

Откуда:
Сообщений: 88
Есть БД

if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Person]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE [dbo].[Person](
Id int NOT NULL ,
F varchar(63) NULL ,
I varchar(63) NULL ,
Sex char(1) NULL ,
BirthDay datetime NULL
) ON [PRIMARY]
GO

insert into Person (Id,F,I,Sex,BirthDay) values (1,'Petrov','Ivan','M','19701205')
go


if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Contact]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE [dbo].[Contact](
Id int NOT NULL ,
Num varchar(255) NOT NULL ,
PersId int NULL
) ON [PRIMARY]
GO

insert into Contact (Id,Num,PersId) values (1,'495-234-56-78',1)
insert into Contact (Id,Num,PersId) values (2,'903-234-56-78',1)
insert into Contact (Id,Num,PersId) values (3,'916-234-56-78',1)
go


if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Work]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
CREATE TABLE [dbo].[Work](
Id int NOT NULL ,
NameComp varchar(63) NOT NULL ,
PersId int NOT NULL
) ON [PRIMARY]
GO

insert into Work (Id,NameComp,PersId) values (1,'One',1)
insert into Work (Id,NameComp,PersId) values (2,'Two',1)
insert into Work (Id,NameComp,PersId) values (3,'Three',1)
go




Нужно сформировать XML вида

<Person>
<Id>1</Id>
<F>Petrov</F>
<I>Ivan</I>
<Sex>M</Sex>
<BirthDay>1970-12-05T00:00:00</BirthDay>
<Contacts>
<Contact>
<Id>1</Id>
<Num>495-234-56-78</Num>
<PersId>1</PersId>
</Contact>
<Contact>
<Id>2</Id>
<Num>903-234-56-78</Num>
<PersId>1</PersId>
</Contact>
<Contact>
<Id>3</Id>
<Num>916-234-56-78</Num>
<PersId>1</PersId>
</Contact>
</Contacts>
<Works>
<Work>
<Id>1</Id>
<NameComp>One</NameComp>
<PersId>1</PersId>
</Work>
<Work>
<Id>2</Id>
<NameComp>Two</NameComp>
<PersId>1</PersId>
</Work>
<Work>
<Id>3</Id>
<NameComp>Three</NameComp>
<PersId>1</PersId>
</Work>
</Works>
</Person>


select *
from Person
inner join Contact on Contact.PersId=Person.Id
inner join Work on Work.PersId=Person.Id
for XML AUTO, ELEMENTS

а получаем

<Person>
<Id>1</Id>
<F>Petrov</F>
<I>Ivan</I>
<Sex>M</Sex>
<BirthDay>1970-12-05T00:00:00</BirthDay>
<Contact>
<Id>1</Id>
<Num>495-234-56-78</Num>
<PersId>1</PersId>
<Work>
<Id>1</Id>
<NameComp>One</NameComp>
<PersId>1</PersId>
</Work>
<Work>
<Id>2</Id>
<NameComp>Two</NameComp>
<PersId>1</PersId>
</Work>
<Work>
<Id>3</Id>
<NameComp>Three</NameComp>
<PersId>1</PersId>
</Work>
</Contact>
<Contact>
<Id>2</Id>
<Num>903-234-56-78</Num>
<PersId>1</PersId>
<Work>
<Id>1</Id>
<NameComp>One</NameComp>
<PersId>1</PersId>
</Work>
<Work>
<Id>2</Id>
<NameComp>Two</NameComp>
<PersId>1</PersId>
</Work>
<Work>
<Id>3</Id>
<NameComp>Three</NameComp>
<PersId>1</PersId>
</Work>
</Contact>
<Contact>
<Id>3</Id>
<Num>916-234-56-78</Num>
<PersId>1</PersId>
<Work>
<Id>1</Id>
<NameComp>One</NameComp>
<PersId>1</PersId>
</Work>
<Work>
<Id>2</Id>
<NameComp>Two</NameComp>
<PersId>1</PersId>
</Work>
<Work>
<Id>3</Id>
<NameComp>Three</NameComp>
<PersId>1</PersId>
</Work>
</Contact>
</Person>

подскажите плиз, как получить нужный формат XML
29 май 11, 14:29    [10726988]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
AUTO никогда не создаст вам разноименные ноды на одном уровне вложенности. Это надо через PATH делать, а подмножества Contacts и Works оформлять как подзапросы.
29 май 11, 14:41    [10727015]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML  [new]
PavelNK
Member

Откуда:
Сообщений: 88
Ennor Tiegael, пробовал все равно получается, по сути, тоже самое
29 май 11, 14:46    [10727027]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
PavelNK
+ схема
use tempdb
GO
CREATE TABLE [dbo].[Person](
  Id int NOT NULL ,
  F varchar(63) NULL ,
  I varchar(63) NULL ,
  Sex char(1) NULL ,
  BirthDay datetime NULL
)
GO
CREATE TABLE [dbo].[Contact](
  Id int NOT NULL ,
  Num varchar(255) NOT NULL ,
  PersId int NULL
)
GO
CREATE TABLE [dbo].[Work](
  Id int NOT NULL ,
  NameComp varchar(63) NOT NULL ,
  PersId int NOT NULL 
)
GO
+ тестовые данные
insert dbo.Person values
 (1,'Petrov','Ivan','M','19701205')
insert dbo.Contact values
 (1,'495-234-56-78',1)
,(2,'903-234-56-78',1)
,(3,'916-234-56-78',1)
insert dbo.[Work] values
 (1,'One',1)
,(2,'Two',1)
,(3,'Three',1)
+ получить
<Person>
  <Id>1</Id>
  <F>Petrov</F>
  <I>Ivan</I>
  <Sex>M</Sex>
  <BirthDay>1970-12-05T00:00:00</BirthDay>
  <Contacts>
    <Contact>
      <Id>1</Id>
      <Num>495-234-56-78</Num>
      <PersId>1</PersId>
    </Contact>
    <Contact>
      <Id>2</Id>
      <Num>903-234-56-78</Num>
      <PersId>1</PersId>
    </Contact>
    <Contact>
      <Id>3</Id>
      <Num>916-234-56-78</Num>
      <PersId>1</PersId>
    </Contact>
  </Contacts>
  <Works>
    <Work>
      <Id>1</Id>
      <NameComp>One</NameComp>
      <PersId>1</PersId>
    </Work>
    <Work>
      <Id>2</Id>
      <NameComp>Two</NameComp>
      <PersId>1</PersId>
    </Work>
    <Work>
      <Id>3</Id>
      <NameComp>Three</NameComp>
      <PersId>1</PersId>
    </Work>
  </Works>
</Person>
Не получается:
select *
from Person
  join Contact on Contact.PersId=Person.Id
  join [Work] on [Work].PersId=Person.Id
 for XML AUTO, ELEMENTS   
+ результат
<Person>
  <Id>1</Id>
  <F>Petrov</F>
  <I>Ivan</I>
  <Sex>M</Sex>
  <BirthDay>1970-12-05T00:00:00</BirthDay>
  <Contact>
    <Id>1</Id>
    <Num>495-234-56-78</Num>
    <PersId>1</PersId>
    <Work>
      <Id>1</Id>
      <NameComp>One</NameComp>
      <PersId>1</PersId>
    </Work>
    <Work>
      <Id>2</Id>
      <NameComp>Two</NameComp>
      <PersId>1</PersId>
    </Work>
    <Work>
      <Id>3</Id>
      <NameComp>Three</NameComp>
      <PersId>1</PersId>
    </Work>
  </Contact>
  <Contact>
    <Id>2</Id>
    <Num>903-234-56-78</Num>
    <PersId>1</PersId>
    <Work>
      <Id>1</Id>
      <NameComp>One</NameComp>
      <PersId>1</PersId>
    </Work>
    <Work>
      <Id>2</Id>
      <NameComp>Two</NameComp>
      <PersId>1</PersId>
    </Work>
    <Work>
      <Id>3</Id>
      <NameComp>Three</NameComp>
      <PersId>1</PersId>
    </Work>
  </Contact>
  <Contact>
    <Id>3</Id>
    <Num>916-234-56-78</Num>
    <PersId>1</PersId>
    <Work>
      <Id>1</Id>
      <NameComp>One</NameComp>
      <PersId>1</PersId>
    </Work>
    <Work>
      <Id>2</Id>
      <NameComp>Two</NameComp>
      <PersId>1</PersId>
    </Work>
    <Work>
      <Id>3</Id>
      <NameComp>Three</NameComp>
      <PersId>1</PersId>
    </Work>
  </Contact>
</Person>
PATH пробовал все равно получается, по сути, тоже самое
SELECT	 P.Id
	,P.F
	,P.I
	,P.Sex
	,P.BirthDay
--	 P.*
	,(	SELECT	 C.Id
			,C.Num
--			,C.PersId	-- Безполезные дублирующие говно-данные, нафиг их
--			 C.*
		FROM	dbo.Contact	C
		WHERE	C.PersId = P.Id
		FOR XML Path('Contact'),Type)	AS [Contacts]
	,(	SELECT	 W.Id
			,W.NameComp
--			,W.PersId	-- Безполезные дублирующие говно-данные, нафиг их
--			 W.*
		FROM	dbo.[Work]	W
		WHERE	W.PersId = P.Id
		FOR XML Path('Work'),Type)	AS [Works]
FROM	dbo.Person P
FOR XML Path('Person'),Type
-- Elements - говно, и очень неудбно тем кто этот XML будет считывать/парсить/XSD-ить, не подставляйте людей, пишите Attributes (@)
-- Всегда пишите схему (dbo) и алиасы (P,C,W) и не познаете бед
29 май 11, 16:17    [10727263]     Ответить | Цитировать Сообщить модератору
 Re: Формирование XML  [new]
PavelNK
Member

Откуда:
Сообщений: 88
Mnior, СПАСИБО ОГРОМНОЕ!!!
29 май 11, 17:19    [10727376]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить