我有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数据集字段。所以这就是我的尝试:
在usp_Decision中创建了一个临时表,并尝试“插入#tt exec usp_SP1”。这没有成功。错误“insert exec无法嵌套”
在usp_Decision中尝试将表变量传递给每个存储过程并更新存储过程中的表并执行“select * from”。这也没有成功。作为参数传递的表变量不能在存储过程中修改。
请建议可以做些什么。
答案 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调用的环回连接)