2011-03-28 148 views

回答

2

您需要使用INSERT ... EXEC存儲數據從SP到表或表變量。然後你可以加入。

說出SP返回一個表(INT,B爲varchar(10),C DATETIME)

declare @temp table (a int, b varchar(10), c datetime) 
; 
insert @temp 
exec myproc 1, 10, 'abcdef' 
; 
select * 
from @temp t join othertable o on ... etc 

,而無需創建一個臨時表時,如果還排除表變量,那麼唯一的選擇 - 提供SP不採取任何參數,是使用OPENQUERY來運行SP來返回表。僞:

select * 
from OPENQUERY(local_server, 'spname_no_params') t 
join othertable o on ... etc 
+0

我能加入,而無需創建臨時表? – Rauf 2011-03-28 09:01:54

+1

不要這樣想。 – 2011-03-28 09:02:41

+0

@Rauf - 更新回答 – RichardTheKiwi 2011-03-28 09:04:43

0

不,這是不可能的。你可以做的就是將該SP的輸出放入一個臨時表中,並將它用於你的連接語句。

2

您不能直接加入存儲過程。因此,您需要使用Richard的答案中的方法,或者您可以將sproc轉換爲表值函數。

例如

CREATE FUNCTION dbo.fxnExample(@Something INTEGER) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT A, B 
FROM MyTable 
WHERE Something = @Something 
) 

,你再使用/在這樣的查詢JOIN上:

SELECT t1.Foo, f.A, f.B 
FROM Table1 t1 
    JOIN dbo.fxnExample(1) f ON t1.A = f.A 

的一點要注意的是,你不能做一個用戶自定義函數的一切,你可以在一個存儲過程等等取決於你的sproc做什麼,這可能是不可能的。此外,爲了獲得最佳性能,您應該將其作爲上面示例中的內聯表值函數。另一種方法是多語句表值函數,由於執行計劃產生的方式會基於假設它返回的行數非常低(即1),因此可能會給您帶來糟糕的性能 - 因此如果它返回的行數較多,則性能可能很差。

這裏的好就可以了MSDN文章:http://blogs.msdn.com/b/psssql/archive/2010/10/28/query-performance-and-multi-statement-table-valued-functions.aspx