2010-12-15 69 views
0

我有2個存儲過程:臨時表麻煩

第一個創建#TempTable

CREATE PROCEDURE CreateTempTable 
AS 
BEGIN 
    IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
    BEGIN 
     DROP TABLE #TempTable; 
    END 

    CREATE TABLE #TempTable(
     Value real NOT NULL   
END 

第二個在我#TempTable

CREATE PROCEDURE InsertData 
     @Value real 
    AS 
    BEGIN 
     INSERT #TempTable (Value) VALUES @Value 
    END 

插入數據當我打電話給這些程序時,我有一個錯誤:

exec CreateTempTable 
exec InsertData" 1 
go 

名稱'#TempTable'在InsertData中無效

你能幫我嗎?

回答

2

在存儲區內創建的臨時表會在存儲區結束後自動刪除。

您有幾種選擇:

  • 創建存儲過程作爲一個獨立的查詢外的臨時表。然後連接關閉後
  • 創建首先創建臨時表中的存儲過程,然後調用其他存儲過程
  • 使用全局臨時表將被刪除(小心 - 併發問題可以用這個突然出現)
1

我想這裏的問題是,你正在創建一個本地臨時表,這是無法訪問CreateTempTable以外。您應該創建一個全球臨時表,通過使用##而不是#

編輯是的,就是這樣。以下是您的固定腳本:

CREATE PROCEDURE CreateTempTable 
AS 
BEGIN 
    IF OBJECT_ID('tempdb..##TempTable') IS NOT NULL 
    BEGIN 
     DROP TABLE ##TempTable; 
    END 

    CREATE TABLE ##TempTable(
     Value real NOT NULL 
    ) 
END 
GO 

CREATE PROCEDURE InsertData 
    @Value real 
AS 
BEGIN 
    INSERT ##TempTable (Value) VALUES (@Value) 
END 
GO 

exec CreateTempTable 
exec InsertData 1 
go 
+0

如果sproc一次由多個用戶運行,則全局臨時表存在爭用問題。把它變成全球化並稱之爲一天可能不是一個好主意。 – Donnie 2010-12-15 15:59:20

+0

是的,但那是*不* OP要求的。無論如何,感謝您的信息。 – rsenna 2010-12-15 16:23:17