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

Откуда:
Сообщений: 344
Коллеги, столкнулся со следующей задачей:

Есть таблица.

  if exists (select * from sys.tables where name='test')
drop table test;
go
create table test (id int primary key, name nvarchar(128), col1 int, col2 nvarchar(100), col3 float )
go
insert into test (id,name,col1,col2,col3) values(1,'проба',1,'fff',90)
insert into test (id,name,col1,col2,col3) values(2,'second',444,'f3ff',990)
insert into test (id,name,col1,col2,col3) values(3,'третий',333,'ff21',-99)

Нужно сформировать запрос, который выведет dataset следующего вида (привожу столбцы):

id, name , xml (в этот столбец необходимо записать все остальные поля как xml (вид xml неважен)

Проблема в том, что в реальной таблице, для которой это нужно сделать нет первичного ключа и подзапросами не извернуться. Т.е. вариант, когда в колонке мы пишем (select col1, col2,col3 from test where ... for xml )
не подойдёт
4 июн 09, 21:12    [7267487]     Ответить | Цитировать Сообщить модератору
 Re: представить часть столбцов в xml  [new]
el Pueblo
Member

Откуда: Харьков
Сообщений: 202
для 2005 и выше можно так (если правильно понял):
;with cte as (select row_number() over(order by [name]) as id, [name], col1, col2, col3 from test)
select  t.[name] 
		,(select t1.col1, t1.col2, t1.col3 
			from cte t1 
			where t.id=t1.id  
			for xml path) as [xml]
from cte t
4 июн 09, 22:28    [7267705]     Ответить | Цитировать Сообщить модератору
 Re: представить часть столбцов в xml  [new]
loki1984
Member

Откуда:
Сообщений: 344
Я специально отметил, что такой вариант не подойдёт по причине отсутствия первичного ключа :-(
4 июн 09, 23:14    [7267787]     Ответить | Цитировать Сообщить модератору
 Re: представить часть столбцов в xml  [new]
loki1984
Member

Откуда:
Сообщений: 344
прошу прощения, невнимательно посмотрел запрос, в принципе подходит, но боюсь медленно будет.

пока склоняюсь с вариантом сохранения всего dataset через select id,name ... from test for xml
в переменную xml, а потом через openxml вытащить нужные столбцы и само тело xml для кажой строки.
4 июн 09, 23:24    [7267819]     Ответить | Цитировать Сообщить модератору
 Re: представить часть столбцов в xml  [new]
loki1984
Member

Откуда:
Сообщений: 344
в результате пока склоняюсь к такому варианту:

  if exists (select * from sys.tables where name='test')
drop table test;
go
create table test (id int primary key, name nvarchar(128), col1 int, col2 nvarchar(100), col3 float )
insert into test (id,name,col1,col2,col3) values(1,'проба',1,'fff',90)
insert into test (id,name,col1,col2,col3) values(2,'second',444,'f3ff',990)
insert into test (id,name,col1,col2,col3) values(3,'третий',333,'ff21',-99)


declare @xml as xml,@idoc int
select @xml = (select id, name  from test for xml path('test'), root ('root')
)

EXEC sp_xml_preparedocument @idoc OUTPUT, @xml
select id,name,test
FROM OPENXML (@idoc, '/root/test',2)
with
(
  id int 'id',
  name nvarchar(128) 'name',
  test xml '../test'
  )
EXEC sp_xml_removedocument @idoc
4 июн 09, 23:59    [7267879]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить