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

Откуда: Киев
Сообщений: 438
Доброе время суток,

есть три таблицы с данными для xml:
declare @root varchar(max) = 'rootName'

-- свойства для заголовка
declare @header table (h1 int, h2 varchar(max))
insert @header
values (10, 'this is header') -- только одна строка заголовка

-- строки id получателей
declare @recipients table (id int)
insert @recipients
values (100), (200)

-- строки данных
declare @rows table (f1 int, f2 varchar(max))
insert @rows
values (5, 'text1'), (7, 'text2')

select * from @header
select * from @recipients
select * from @rows


Вопрос: как можно из них одним select'ом получить xml вида:
<rootName h1="10" h2="this is header">
	<recipients>
		<row id="100">
		<row id="200">
	</recipients>
	<data>
		<row f1="5" f2="text1">
		<row f1="7" f2="text2">
	</data>
</rootName>


а также ещё одним отдельным Select'ом xml без получателей и без обрамления строк данных элементом data вида:
<rootName h1="10" h2="this is header">
	<row f1="5" f2="text1">
	<row f1="7" f2="text2">
</rootName>


Возможно ли это сделать без использования Dynamic SQL?
21 ноя 13, 09:16    [15166118]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
сорри, правил текст сообщения на три таблицы, а в заголовке осталось две )
21 ноя 13, 09:17    [15166124]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
Leax, не помню точно как, но определенно можно.
что-то там с таким форматом [поле!поле!поле!поле]
21 ноя 13, 09:29    [15166185]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
XML EXPLICIT
нашел)
как вариант им воспользуйся
21 ноя 13, 09:32    [15166201]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
select
 h1 as [@h1],
 h2 as [@h2],
 (select id as [@id] from @recipients for xml path('row'), type) as recipients,
 (select f1 as [@f1], f2 as [@f2] from @rows for xml path('row'), type) as data
from
 @header
for xml path('rootName'), type;

select
 h1 as [@h1],
 h2 as [@h2],
 (select f1 as [@f1], f2 as [@f2] from @rows for xml path('row'), type) as [*]
from
 @header
for xml path('rootName'), type;
21 ноя 13, 10:13    [15166425]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
invm,

Работает, спасибо!

А без конкретного перечисления колонок таблиц это возможно сделать?
Я спрашиваю с целью универсализации скрипта. Чтобы можно было указать только имена таблиц, а столбцы выбирались из каждой все имеющиеся (таблица.*)
21 ноя 13, 10:21    [15166464]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Leax
А без конкретного перечисления колонок таблиц это возможно сделать?
use tempdb;
go

create table dbo.t (f1 int, f2 int);
insert into dbo.t values (1, 1), (2, 2);
go

create view dbo.vt
as
select
 f1 as [@f1], f2 as [@f2]
from
 dbo.t
go

select
 1 as [@attr1],
 (select * from dbo.vt for xml path('row'), type) as [*]
for xml path('root'), type;
go

drop view dbo.vt;
drop table dbo.t;
go
21 ноя 13, 11:02    [15166747]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
invm,
спасибо большое.

К сожалению, последний вариант не подходит- тут ещё для таблицы и вьюху приходится создавать, а не то что в один select делать.
А во вьюхе всё-равно приходится поля перечислять с новыми заголовками.
21 ноя 13, 17:18    [15169932]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
daw
Member

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

так?
select
  rootName.*
  , (select * from @recipients row for xml auto, type) recipients
  , (select * from @rows row for xml auto, type) data
from @header rootName
for xml auto
21 ноя 13, 18:03    [15170174]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
Leax
Member

Откуда: Киев
Сообщений: 438
daw,
отлично, спасибо! просто идеально!

Просто для справки: а имена элементов rootName, data, recipients реально задавать именами переменных (без Dynamic SQL) или это уже за гранью возможного?
Я имею в виду - в переменных прописать имена этих элементов, а потом подставить эти переменные в Select
21 ноя 13, 19:15    [15170463]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Leax
daw,
отлично, спасибо! просто идеально!

Просто для справки: а имена элементов rootName, data, recipients реально задавать именами переменных (без Dynamic SQL) или это уже за гранью возможного?
Я имею в виду - в переменных прописать имена этих элементов, а потом подставить эти переменные в Select

такое только динамикой уже.
21 ноя 13, 22:51    [15171028]     Ответить | Цитировать Сообщить модератору
 Re: создание xml из двух таблиц  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
daw
такое только динамикой уже.
А главное не нужно для практических задач.
22 ноя 13, 03:44    [15171746]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить