2014-07-25 171 views
0

我有兩個相當大且複雜的存儲過程。我想從第一個存儲過程調用第二個存儲過程。例如:從另一個存儲過程調用存儲過程

-- stored_procedure_one 
select tb1.col1, tb1.col2, sp1.col3, sp1.col4 
from table1 tb1 
inner join stored_procedure_two sp1 on sp1.col1 = tbl1.col1 

與SQL有類似的可能性,因爲上面的腳本給了我一個無效的對象錯誤消息。

在這個例子中使用臨時表並不好,因爲如果我這樣做了,只需要一個小時就可以用第二個存儲過程中的所有數據填充臨時表。我只希望存儲過程返回所需的數據。

+1

你是否真的需要基於某些ID的全部5000萬行或總計輸出記錄?你可能應該重新考慮你的查詢並創建一個更適合這個特定情況的查詢,而不是嘗試將兩個單獨的查詢混合到一些frankenstein查詢中,因爲你不想重構。花費的時間可能是值得的。 –

回答

3

這是行不通的添加第二個過程的結果。您無法加入存儲過程。但是,您可以考慮將stored_procedure_two更改爲table-valued user defined function。然後,您可以通過交叉申請「加入」。我多次做到這一點,並且工作得很好。

如果第二個存儲過程太大又複雜,則可能無法將其轉換爲UDF。在這種情況下,我認爲你唯一的選擇是將第二個存儲過程的結果保存到一個表中並加入。但是這可能會有些低效和混亂。

+0

這聽起來比使用預填充5000萬個臨時表更合理行。我會立即檢查出來。謝謝。 – oshirowanen

+0

會有可能嗎?即在視圖中具有存儲過程二的複雜性,然後在存儲過程中與視圖內部聯接一個? – oshirowanen

+0

我們需要看到程序告訴你 – OGHaza

0

你可能在一個局部變量表

DECLARE @Table TABLE 
(
    Col1 int, 
    Col2 ... 
) 

INSERT INTO @Table 
EXEC stored_procedure_two 

select tb1.col1, tb1.col2, sp1.col3, sp1.col4 
from table1 tb1 
inner join @Table tbl2 on sp1.col1 = tbl1.col1 
+0

正如我在我的問題的最後一段中試圖解釋的那樣,我不認爲這對我的具體情況是非常實際的。 – oshirowanen

+0

Yeap,現在注意到了。那麼,如果你想要sp,這是一個辦法。另一種方式是建議有一個表值函數。但即使這樣也會導致兩次使用相同的代碼。 –

+0

@OGHaza,我不能這樣做,因爲如果我在整個運行存儲過程2時,大約需要一個小時,這就是爲什麼我只想運行基於存儲過程1和內部聯接的一部分,存儲過程所需的兩項數據。 – oshirowanen

相關問題