2011-03-28 113 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