繁体   English   中英

sql服务器存储过程

[英]sql server stored procedure

我可以将一个表与一个存储过程结合起来返回一个表吗?

谢谢

您需要使用INSERT..EXEC来将SP中的数据存储到表或表变量中。 然后,您可以加入。

假设SP返回一个表(a 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

您不能直接加入存储过程。 因此,您要么需要根据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

需要注意的是,您无法在存储过程中执行用户定义函数中的所有操作,因此,取决于存储过程的作用,这可能是不可能的。 同样,为了获得最佳性能,您应该像上面的示例一样,使它成为内联表值函数。 另一种选择是多语句表值函数,由于生成的执行计划将基于该函数返回的行数非常少(即1)的假设,因此它可能会给您带来较差的性能-因此,如果它返回大量行,则性能可能会很差。

这是一篇不错的MSDN文章: http : //blogs.msdn.com/b/psssql/archive/2010/10/28/query-performance-and-multi-statement-table-valued-functions.aspx

不,这不可能。 您可以做的就是将该SP的输出放入一个临时表中,并将其用于join语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM