嵌套插入exec解决

时间:2010-03-24 19:55:56

标签: sql-server tsql sql-server-2008 stored-procedures

我有2个存储过程usp_SP1和usp_SP2。他们都使用插入到#tt exec sp_somesp中。我想创建一个第三个存储过程,它将决定调用哪个存储过程。类似的东西:

create proc usp_Decision
(
   @value int
)
as
begin
   if (@value = 1)
     exec usp_SP1  -- this proc already has insert into #tt exec usp_somestoredproc
   else
        exec usp_SP2  -- this proc too has insert into #tt exec usp_somestoredproc
end

后来,我意识到我需要为usp_Decision的返回值定义一些结构,以便我可以填充SSRS数据集字段。所以这就是我的尝试:

  1. 在usp_Decision中创建了一个临时表,并尝试“插入#tt exec usp_SP1”。这没有成功。错误“insert exec无法嵌套”

  2. 在usp_Decision中尝试将表变量传递给每个存储过程并更新存储过程中的表并执行“select * from”。这也没有成功。作为参数传递的表变量不能在存储过程中修改。

  3. 请建议可以做些什么。

4 个答案:

答案 0 :(得分:1)

你可以修改usp_SP1和usp_SP2吗?

如果是这样,在usp_Decision中,使用适当的模式创建一个本地临时表以插入结果:

create table #results (....)

然后,在被调用的过程中,测试该临时表的存在。如果存在,则插入临时表。如果不是,请照常返回结果集。如果从其他地方调用嵌套过程,这有助于保留现有行为。

if object_id('tempdb..#results') is not null begin
  insert #results (....)
  select .....
end
else begin
  select ....
end

当控制返回到调用过程时,#results将由嵌套的proc填充,无论哪个被调用。

如果结果集不共享相同的模式,则可能需要在usp_Decision中创建两个临时表。

答案 1 :(得分:0)

在任何情况下都不是全局临时表的粉丝(其他进程可以读取这些表并可能干扰其中的数据)。

为什么不让每个proc使用本地临时表并从该表中选择*作为最后一步。 然后,您可以插入调用proc中的本地临时表。

简单的例子

create proc usp_mytest1
as
select top 1 id into #test1
from MYDATABASE..MYTABLE (nolock)

select * from #test1
go
--drop table #test
create proc usp_mytest2
as
select top 10 MYTABLE_id into #test2
from MYDATABASE..MYTABLE (nolock)

select * from #test2
go

create proc usp_mytest3 (@myvalue int)
as
create table #test3 (MYTABLE_id int)
if @myvalue = 1
Begin
insert #test3
exec ap2work..usp_mytest1
end
else
begin
insert #test3
exec ap2work..usp_mytest2
end

select * from #test3

go

exec ap2work..usp_mytest3 1

exec ap2work..usp_mytest3 0

答案 2 :(得分:0)

您是否查看了表值用户定义的函数(内联函数或多语句)?与HLGEM的建议类似,这将返回一个您可能不必插入任何位置的集合。

答案 3 :(得分:0)

对于一个wortkaround,请参阅此blog article(使用OPENROWSET实质上创建一个发生INSERT EXEC调用的环回连接)