2015-05-21 63 views
0

我有嵌套的存儲過程,我需要在子進程中創建一個LOCAL TEMP TABLE並能夠在父進程中使用它。在父進程中的子進程中聲明的訪問#TempTable

EX:

父程序:

EXEC ChildProcedure 
SELECT * FROM #TempTable 

子過程:

CREATE TABLE #TempTable (Field1 VARCHAR(1000),Field2 VARCHAR(1000)) 
INSERT INTO #TempTable (Field1,Field2) VALUES ('1','2') 

當我嘗試這個,SQL說:

無效的對象名稱#TempTable '

有沒有什麼辦法可以在沒有GLOBAL TEMP TABLES的情況下實現這一點?

+0

看起來你想在存儲過程之間共享信息。 Erland Sommarskog在這個主題上有一個很好的博客:http://www.sommarskog.se/share_data.html。 –

+3

子程序*是否*是*創建表的那個?讓父母創建它並讓孩子填充它實現起來微不足道。反過來說,[自](https://msdn.microsoft.com/en-us/library/ms174979.aspx):「在存儲過程中創建的本地臨時表將在存儲時自動刪除程序完成「 –

+0

@Damien_The_Unbeliever是的,我也達成你的意見,但我想知道是否有另一種方式來做到這一點。謝謝。 –

回答

3

嗯,我想我終於找到了答案,我的問題在https://msdn.microsoft.com/en-us/library/ms174979.aspx

當存儲過程完成時,將自動刪除在存儲過程中創建的本地臨時表。 該表可以由創建該表的存儲過程執行的任何嵌套存儲過程引用。該表不能被調用創建該表的存儲過程的進程引用。

所以我自己的問題的答案是NO。我不能那樣做。

最好的方法(就像@Damien_The_Unbeliever說的)是在父程序中創建表並在子程序中填充它。

1

相反程序,您可以創建這樣的表值函數和使用

Create Function ChiledFunction() 
Returns @TempTable Table (Field1 VARCHAR(1000),Field2 VARCHAR(1000)) AS 
Begin 
INSERT INTO @TempTable (Field1,Field2) VALUES ('1','2') 
Return 
end 

和家長的程序是在這裏

Create Procedure ParentProc 
As 
begin 
    select * from dbo.ChiledFunction() 

end 
+0

函數不是一個過程.... –

+0

@ N.Molderf這是一個解決方案,它可能是任何東西,它不是一個僅適用於過程的範圍。 –

+0

這個功能你可以在任何地方不僅在父母程序中使用 –