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

Откуда: Москва
Сообщений: 448
Добрый день Всем!

Прошу разъяснить суть сообщения сервера:
автор
Сообщение 1086, уровень 15, состояние 1, строка 17
Предложение FOR XML недопустимо в представлениях, встроенных функциях, производных таблицах и вложенных запросах, если они содержат оператор SET. Чтобы обойти это ограничение, вложите инструкцию SELECT, содержащую оператор SET, в производную таблицу и примените к этой конструкции предложение FOR XML.

не могу понять, что мне нужно делать, как обойти проблему.

Пытаюсь получить XML и вставить его в xml-поле таблицы
с помощью процедуры или функции, но ...... неудачно
набросал упрощенный пример, сама задача немного сложнее
use tst
go
drop table t1;
go
create table t1(id int identity
, name1 varchar(20) default 'name1value'
, name2 varchar(20) default 'name2value'
);
go
insert into t1 default values;
insert into t1 default values;
insert into t1 default values;
insert into t1 default values;
go
--select * from t1;
go
drop table t1_xml;
go
create table t1_xml(id int, doc xml);
go
--drop procedure p1;
go
alter procedure p1(@id int)
as
begin
	declare @doc xml;
	set @doc=(
		select 1 as tag
			, 0 as parent
			, id as [aaa!1!id]
			, null as [bbb!2!name1!element]				 
			, null as [bbb!2!name2!element]				 
			from t1
		union all
		select 2 as tag
			, 1 as parent
			, id
			, name1
			, name2
			from t1 
		order by [aaa!1!id], tag
		for xml explicit
				);
	--insert into t1_xml
	--select 1, @doc;
end;
go

exec p1 1;
пробовал создавать функцию,
убирал строку
set @doc=(
многократно читал сообщение сервера, но не могу уловить сути

помогите, пожлуйста
31 июл 09, 14:51    [7484979]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
set @doc=(

нельзя
31 июл 09, 14:54    [7484993]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
use-se
Member

Откуда: Москва
Сообщений: 448
Konst_One
set @doc=(

нельзя

а как можно ))
вот почему это работает???
create function f1(@id int) returns xml
as
begin
	declare  @doc xml;
	set @doc=(select * from t1 for xml auto, elements);
	return @doc;
end;

insert into t1_xml(id,doc)
select 2, dbo.f1(1)

select * from t1_xml
31 июл 09, 14:58    [7485035]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
order by [aaa!1!id], tag

что это?
31 июл 09, 15:06    [7485099]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Konst_One
order by [aaa!1!id], tag

что это?


Судя по брекетам - имя поля.
31 июл 09, 15:09    [7485125]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
может так хотели?

select 1 as tag
			, 0 as parent
			, id as [aaa!1!id]
			, name1 as [aaa!1!name1!element]				 
			, name2 as [aaa!1!name2!element]				 
			from t1
for xml explicit
31 июл 09, 15:10    [7485134]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
daw
Member

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

> не могу понять, что мне нужно делать, как обойти проблему.

set @doc=(
  select *
  from (
	  select 1 as tag
		  , 0 as parent
		  , id as [aaa!1!id]
		  , null as [bbb!2!name1!element]				
		  , null as [bbb!2!name2!element]				
		  from t1
	  union all
	  select 2 as tag
		  , 1 as parent
		  , id
		  , name1
		  , name2
		  from t1
  ) t
		order by [aaa!1!id], tag
		for xml explicit
				);


Posted via ActualForum NNTP Server 1.4

31 июл 09, 15:16    [7485195]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
use-se
Member

Откуда: Москва
Сообщений: 448
Konst_One
order by [aaa!1!id], tag

что это?

это сортировка, что бы все правильно показывалось
31 июл 09, 15:25    [7485288]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
см вариант daw, он вам показал где ее надо было вставить
31 июл 09, 15:27    [7485298]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
use-se
Member

Откуда: Москва
Сообщений: 448
daw

> не могу понять, что мне нужно делать, как обойти проблему.

set @doc=(
  select *
  from (
	  select 1 as tag
		  , 0 as parent
		  , id as [aaa!1!id]
		  , null as [bbb!2!name1!element]				
		  , null as [bbb!2!name2!element]				
		  from t1
	  union all
	  select 2 as tag
		  , 1 as parent
		  , id
		  , name1
		  , name2
		  from t1
  ) t
		order by [aaa!1!id], tag
		for xml explicit
				);


а вот это работает, спасибо большое

всем спасибо за участие
31 июл 09, 15:30    [7485333]     Ответить | Цитировать Сообщить модератору
 Re: for xml explicit (использование в функциях и процедурах)  [new]
daw
Member

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

переведено действительно блестяще просто :(
в английском варианте выглядит так:
Msg 1086, Level 15, State 1, Line 32
The FOR XML clause is invalid in views, inline functions, derived tables, and subqueries when they contain a set 
operator. To work around, wrap the SELECT containing a set operator using derived table syntax and apply FOR XML on top 
of it.

под "set operator" понимаются операторы "вертикального" объединения - union, except или intersect.

Posted via ActualForum NNTP Server 1.4

31 июл 09, 15:32    [7485353]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить