我有4個存儲過程。我需要將第一個存儲過程(2個臨時表)的結果傳遞給第二個存儲過程。這些臨時表需要在第二個存儲過程的from子句中使用。有沒有辦法跨存儲過程傳遞臨時表
相似性第三個和第四個存儲過程需要先前存儲過程的結果。 有沒有辦法跨存儲過程傳遞臨時表?
我有4個存儲過程。我需要將第一個存儲過程(2個臨時表)的結果傳遞給第二個存儲過程。這些臨時表需要在第二個存儲過程的from子句中使用。有沒有辦法跨存儲過程傳遞臨時表
相似性第三個和第四個存儲過程需要先前存儲過程的結果。 有沒有辦法跨存儲過程傳遞臨時表?
關於這個評論,「它是1個Sp,但我們把它分成4個,所以如果需要更容易改變」,我建議你把它分解得更多。換句話說,實現封裝。
每次要從實際表中選擇數據時都有一個單獨的存儲過程。不要在這些過程中填充臨時表,只返回數據。
然後編寫一個存儲過程,創建並填充上述過程的臨時表,並進行必要的處理。
下面是一個簡單的例子:
create procedure GetData1
select Field1, Field2
from blah, blah, blah
create procedure AssembleAllData
create table #temp1 (Field1, Field2)
insert into #temp1
exec GetData1
select Field1, Field2, etc
from #temp1 join anActualTable etc
drop table #temp1
在當前的SP1,您可以創建臨時表通過名稱到第二個存儲過程像下面
SP1代碼
IF OBJECT_ID('tempdb.dbo.#TempTable1') IS NOT NULL
DROP TABLE #TempTable1
EXEC SP2 N'#TempTable1'
裏面的SP2就可以值插入#TempTable1這將提供給主叫SP
SP2代碼
CREATE procedure [dbo].[SP2]
@outTempTable NVARCHAR(128)
AS
IF @outTempTable IS NOT NULL AND LEN(@outTempTable) > 0
BEGIN
EXEC ( 'INSERT INTO ' + @outTempTable + ' SELECT * FROM TableA')
END
你的問題聽起來更像是一個答案,而不是一個問題。按照你的描述去做。
您不需要通過臨時表中的數據從一個過程到下一個過程。數據就在那裏。在一個過程中,您可以寫入臨時表以及從臨時表讀取的下一個過程中。
我也不會動態創建臨時表,只是創建它們並讓它們等待數據。這假設臨時表數據對於會話來說是本地的(在oracle中是這種情況,並且存在臨時表的原因)。
此外,我會選擇不同程序之間傳遞表名稱。幾乎總是有更好的方法,反正也是不行的。如果您的印象是需要變量臨時表名稱,那麼您確實需要在臨時表中添加另一列(您甚至可以將其稱爲「temp_table_name」,儘管它幾乎肯定意味着不同)。然後,您可以傳遞「temp_table_name」,選擇將需要where temp_table_name = ...
,並且插入必須填充此額外的列。
我不確定這會起作用。我的理解是,一旦填充臨時表的過程完成後,臨時表就會消失。儘管如此,我必須嘗試一下。 – 2014-09-25 15:39:05
在oracle中,如果其他RDBMS以不同的方式做事,它就不會被忽視。數據可能會在提交時被刪除或保留,直到被明確刪除(取決於它們的創建方式)。我假設你的意思是臨時表,而不是代碼中的某些數據結構。 – 2014-09-25 15:42:07
有一些理由不只是寫一個PROC? – HLGEM 2014-09-25 14:38:53
它是1個Sp,但我們把它分解成4個,所以如果需要更容易更改 – Mwright 2014-09-25 15:32:16
@Mwright,這是SQL服務器還是oracle,我的例子在sql server上工作正常,但對oracle沒有把握。 – radar 2014-09-25 16:04:45