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

Откуда: Санкт-Петербург
Сообщений: 68
Добрый день.

Есть несколько процедур
create table #src (val1 int, val2 int, val3 int) 

insert into #src values(1,2,3),(4,5,6),(7,8,9),(0,1,2),(3,4,5),(6,7,8) 
go 

create procedure dbo.sp1 
	@vl int 
as
declare @tb1 table (vl1 int, vl2 int) 
insert into @tb1 
	select val1, val3 
	from #src 
	where val2 < @vl

select * from @tb1 
go 

create procedure dbo.sp2 
	@vl int 
as
declare @tb2 table (v1 int, v2 int)
insert into @tb2 
	exec dbo.sp1 @vl

select * from @tb2 
go 

declare @tb_res table (vi int, vii int) 
insert into @tb_res  
exec dbo.sp2 3 
 
select * from @tb_res 
	
drop procedure dbo.sp1 
drop procedure dbo.sp2 

drop table #src 
go

При выполнении запроса выдается сообщение об ошибке:
(6 row(s) affected)
Msg 8164, Level 16, State 1, Procedure sp2, Line 6
An INSERT EXEC statement cannot be nested.

(0 row(s) affected)

(0 row(s) affected)

при замене в последнем запросе на другую процедуру, или вызове sp2 отдельно (без insert)
create table #src (val1 int, val2 int, val3 int) 

insert into #src values(1,2,3),(4,5,6),(7,8,9),(0,1,2),(3,4,5),(6,7,8) 
go 

create procedure dbo.sp1 
	@vl int 
as
declare @tb1 table (vl1 int, vl2 int) 
insert into @tb1 
	select val1, val3 
	from #src 
	where val2 < @vl

select * from @tb1 
go 

create procedure dbo.sp2 
	@vl int 
as
declare @tb2 table (v1 int, v2 int)
insert into @tb2 
	exec dbo.sp1 @vl

select * from @tb2 
go 

declare @tb_res table (vi int, vii int) 
insert into @tb_res  
exec dbo.sp1 3 
 
select * from @tb_res 

exec dbo.sp2 3	
	
drop procedure dbo.sp1 
drop procedure dbo.sp2 

drop table #src 
go

все происходит без ошибок.
Представлен тестовый вариант для представления картины, поэтому вопросы зачем это нужно прошу не задавать, в реальности все гораздо сложнее, но ошибка та же.

Подскажите пожалуйста как можно избавиться от этой ошибки, с наименьшими потерями? Переписать процедуры не пройдет, времени не хватит.
server: SQL Server 10.50.2550
4 сен 13, 14:03    [14794136]     Ответить | Цитировать Сообщить модератору
 Re: Вставить в процедуре данные из другой процедуры.  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
сделать @tb1 постояной таблицей
4 сен 13, 14:47    [14794479]     Ответить | Цитировать Сообщить модератору
 Re: Вставить в процедуре данные из другой процедуры.  [new]
Владимир Меньшиков
Member

Откуда: Санкт-Петербург
Сообщений: 68
А без создания постоянных таблиц никак не получится?
5 сен 13, 08:59    [14797220]     Ответить | Цитировать Сообщить модератору
 Re: Вставить в процедуре данные из другой процедуры.  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
можно и временную таблицу сделать(#) до вызова процедуры - она будет видна во вложенных вызовах
5 сен 13, 09:07    [14797252]     Ответить | Цитировать Сообщить модератору
 Re: Вставить в процедуре данные из другой процедуры.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
В вызываемую процедуру добавить битовый параметр @insert_result_into_table. Если параметр равен 0, то выдавать результат в виде селекта. Если равен 1, то вставлять результат во временную таблицу с заранее предопределённым именем (при желании можно и имя временной таблицы передавать как параметр). Перед вызовом процедуры создать временную таблицу, в параметре @insert_result_into_table передать 1. Ну и, конечно, вызов процедуры оформить не как INSERT ... EXEC, а как обычный EXEC.
5 сен 13, 09:08    [14797254]     Ответить | Цитировать Сообщить модератору
 Re: Вставить в процедуре данные из другой процедуры.  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
Гость333
В вызываемую процедуру добавить битовый параметр @insert_result_into_table
С дефолтным значением 0.
5 сен 13, 09:53    [14797489]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить