2010-03-24 88 views
3

我有2個存儲過程usp_SP1和usp_SP2。它們都使用插入#tt exec sp_somesp。我想創建一個第三存儲過程,它將決定哪個存儲過程要調用。喜歡的東西:嵌套插入exec工作

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」。這沒有奏效。錯誤「插入exec不能嵌套」

  2. 在usp_Decision中試圖將表變量傳遞給每個存儲過程,並更新存儲過程中的表並執行「select * from」。那也沒有成功。作爲參數傳遞的表變量不能在存儲過程中修改。

請建議可以做些什麼。

+0

INSERT EXEC的破碎是我對SQL Server最大的寵兒之一。請投票! https://connect.microsoft.com/SQLServer/feedback/details/294571/improve-insert-exec – 2011-12-24 02:52:36

回答

0

在任何情況下都不是全球臨時表的粉絲(其他進程可以讀取這些表並可能干擾其中的數據)。

爲什麼不讓每個proc使用本地臨時表,並從該表中選擇*作爲最後一步。 然後你可以插入調用過程中的本地臨時表。

esimple例如

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 
+0

我在每個存儲過程中使用本地臨時表,因此「插入到#tt exec usp_somestored過程」。現在我想要從usp_Decision存儲過程中的#tt_example中執行select *我將不得不首先插入到#tt_example exec usp_SP1中。但這是不允許的。 我不確定這是否是您建議的方法。如果沒有,請解釋一些僞代碼。 – stackoverflowuser 2010-03-24 21:17:31

+0

我在我的存儲過程中使用#tt exec sp_executesql @query 插入,因此上述方法將無法工作。 – stackoverflowuser 2010-03-25 17:10:08

+0

現在我已經justed將兩個存儲過程合併爲一個。它是一個巨大的,但現在工作。 – stackoverflowuser 2010-03-25 17:10:26

0

你有沒有看看錶值用戶定義函數(內聯或多語句)?與HLGEM的建議類似,這將返回一個您可能不需要在任何地方插入的集合。

0

看到這個blog article一個wortkaround(使用OPENROWSET基本上建立在其上的INSERT EXEC呼叫中的一個發生在一個迴環連接)

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中創建兩個臨時表。