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

Имеються две таблицы с данными такого вида:

CREATE TABLE [dbo].[Cust] (
	[Cust_id] [int] NULL ,
	[RegNum] [varchar] (20)  NULL ,
	[CType] [varchar] (2)  NULL ,
	[Name] [varchar] (120)  NULL ,
	[Status] [tinyint] NULL 
) ON [PRIMARY]
GO


INSERT INTO dbo.Cust
    (
     Cust_id,
     RegNum,
     CType,
     Name,
     Status
    )
VALUES
    (
     1234,
     '40000000000',
     'PP',
     'aaaaaaaaaa',
     10
    )
 
INSERT INTO dbo.Cust
    (
     Cust_id,
     RegNum,
     CType,
     Name,
     Status
    )
VALUES
    (
     1235,
     '50000000000',
     'SS',
     'bbbbbbbbbbb',
     10
    )
 
INSERT INTO dbo.Cust
    (
     Cust_id,
     RegNum,
     CType,
     Name,
     Status
    )
VALUES
    (
     1236,
     '50000000001',
     'PP',
     'ccccccccccccc',
     5
    )
 
INSERT INTO dbo.Cust
    (
     Cust_id,
     RegNum,
     CType,
     Name,
     Status
    )
VALUES
    (
     1237,
     '50000000002',
     'SS',
     'ddddddddddd',
     10
    )
 
INSERT INTO dbo.Cust
    (
     Cust_id,
     RegNum,
     CType,
     Name,
     Status
    )
VALUES
    (
     1238,
     '50000000003',
     'PP',
     'eeeeeeeeeee',
     10
    )
 
INSERT INTO dbo.Cust
    (
     Cust_id,
     RegNum,
     CType,
     Name,
     Status
    )
VALUES
    (
     1239,
     '60000000001',
     'NR',
     'tttttttttttttttt',
     10
    )
 


CREATE TABLE [dbo].[CTypes1] (
	[CType] [varchar] (5)  NOT NULL ,
	[Resident] [bit] NOT NULL ,
	[IsPrivate] [bit] NOT NULL
) ON [PRIMARY]
GO


INSERT INTO dbo.CTypes1
    (
     CType,
     Resident,
     IsPrivate
    )
VALUES
    (
     'PP',
     1,
     1
    )
 
INSERT INTO dbo.CTypes1
    (
     CType,
     Resident,
     IsPrivate
    )
VALUES
    (
     'SS',
     1,
     0
    )
 
INSERT INTO dbo.CTypes1
    (
     CType,
     Resident,
     IsPrivate
    )
VALUES
    (
     'NR',
     0,
     0
    )

Есть запрос который возвращает все поля которые должны быть в XML файле:

SELECt 'B' as MessageType,
	convert(varchar(10),GetDate(),12)+'-'+Cast(c.Cust_id as varchar(10)) as  QueryID,
	'D' as ReportType, 
	'C' as WithChanges,
	CASE 
	 WHEN t.IsPrivate=1 THEN 'P' 
	 ELSE 'J'
	END as PersonType,
	CASE 
	 WHEN t.Resident=1 THEN 'R' 
	 ELSE 'N'
	END as ResidentType,
	c.RegNum as RegNumber
FROM dbo.Cust c INNER JOIN
     dbo.CTypes1 t ON t.Ctype=c.CType
WHERE c.Status>=10

Нужно получить XML следующего вида :

<Message>
  <Header>
  	<MessageType>B</MessageType>
	<QueryID>091001-1234</QueryID>
	<ReportType>D</ReportType>
	<WithChanges>C</WithChanges>
 </Header>
 <Query>
	<PersonType>P</PersonType>
	<ResidentType>R</ResidentType>
	<RegNumber>40000000000</RegNumber>
 </Query>
</Message>
<Message>
  <Header>
  	<MessageType>B</MessageType>
	<QueryID>091001-1235</QueryID>
	<ReportType>D</ReportType>
	<WithChanges>C</WithChanges>
 </Header>
 <Query>
	<PersonType>J</PersonType>
	<ResidentType>R</ResidentType>
	<RegNumber>50000000000</RegNumber>
 </Query>
</Message>
<Message>
  <Header>
  	<MessageType>B</MessageType>
	<QueryID>091001-1237</QueryID>
	<ReportType>D</ReportType>
	<WithChanges>C</WithChanges>
 </Header>
 <Query>
	<PersonType>J</PersonType>
	<ResidentType>R</ResidentType>
	<RegNumber>50000000002</RegNumber>
 </Query>
</Message>
....

как это сделать ?
1 окт 09, 18:11    [7731462]     Ответить | Цитировать Сообщить модератору
 Re: SELECT -> XML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> как это сделать ?

оно?
SELECt 'B' as [Header/MessageType],
	convert(varchar(10),GetDate(),12)+'-'+Cast(c.Cust_id as varchar(10)) as  [Header/QueryID],
	'D' as [Header/ReportType],
	'C' as [Header/WithChanges],
	CASE
	 WHEN t.IsPrivate=1 THEN 'P'
	 ELSE 'J'
	END as [Query/PersonType],
	CASE
	 WHEN t.Resident=1 THEN 'R'
	 ELSE 'N'
	END as [Query/ResidentType],
	c.RegNum as [Query/RegNumber]
FROM dbo.Cust c INNER JOIN
      dbo.CTypes1 t ON t.Ctype=c.CType
WHERE c.Status>=10
for xml path('Message')

Posted via ActualForum NNTP Server 1.4

1 окт 09, 18:28    [7731524]     Ответить | Цитировать Сообщить модератору
 Re: SELECT -> XML  [new]
DenissL
Guest
да, это то что надо !

Спасибо !


Есть еще небольшой вопрос:
SQL Server всегда возвращает XML как одну строку без переноса, или можно установить какой то паремтр чтобы была возвращена строка с переносами.

например так :

<Message>
  <Header>
  	<MessageType>B</MessageType>
	<QueryID>091001-1235</QueryID>
	<ReportType>D</ReportType>
	<WithChanges>C</WithChanges>
 </Header>
 <Query>
	<PersonType>J</PersonType>
	<ResidentType>R</ResidentType>
	<RegNumber>50000000000</RegNumber>
 </Query>
</Message>
<Message>
  <Header>
  	<MessageType>B</MessageType>
	<QueryID>091001-1237</QueryID>
	<ReportType>D</ReportType>
	<WithChanges>C</WithChanges>
 </Header>
 <Query>
	<PersonType>J</PersonType>
	<ResidentType>R</ResidentType>
	<RegNumber>50000000002</RegNumber>
 </Query>
</Message>
1 окт 09, 22:26    [7732064]     Ответить | Цитировать Сообщить модератору
 Re: SELECT -> XML  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Есть еще небольшой вопрос:
> SQL Server всегда возвращает XML как одну строку без переноса, или можно
> установить какой то паремтр чтобы была возвращена строка с переносами.

в xml все эти переносы и пробелы не имеют ровно никакого значения.
они могут быть важны только для визуального представления xml.
поэтому ответ - нет, нельзя. по крайней мере нельзя получить
это с помощью for xml.

Posted via ActualForum NNTP Server 1.4

2 окт 09, 00:14    [7732241]     Ответить | Цитировать Сообщить модератору
 Re: SELECT -> XML  [new]
DenissL
Guest
ок, спсибо, все ясно.
Просто иногда мне надо формировать XML файл в ручную из нескольких кусков сгенерированных запросами и как то привычнее было когда XML с переносами. Но это действительно важно только для визуального восприятия ...
2 окт 09, 16:21    [7736163]     Ответить | Цитировать Сообщить модератору
 Re: SELECT -> XML  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
DenissL
ок, спсибо, все ясно.
Просто иногда мне надо формировать XML файл в ручную из нескольких кусков сгенерированных запросами и как то привычнее было когда XML с переносами. Но это действительно важно только для визуального восприятия ...

Notepad++ + XML Tools plugin

зы а вот опцию типа fomatted в for xml таки хотелось бы.
2 окт 09, 16:23    [7736177]     Ответить | Цитировать Сообщить модератору
 Re: SELECT -> XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А чем сама студия плоха? И ещё куски XML сворачивает и ....
2 окт 09, 23:42    [7737499]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить