我有4个存储过程。我需要获取第一个存储过程的结果(2个临时表)并将其传递给第二个存储过程。这些临时表需要在第二个存储过程的from子句中使用。
相似性第三和第四个存储过程需要先前存储过程的结果。 有没有办法在存储过程中传递临时表?
答案 0 :(得分:1)
关于这个评论,"它是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
答案 1 :(得分:0)
在当前的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
答案 2 :(得分:0)
您的问题听起来更像是答案而不是问题。就像你描述的那样。
您不需要传递临时表中的数据,从一个过程到下一个过程。数据就在那里。在一个过程中,您将写入临时表,并在下一个过程中从临时表中读取。
我也不会动态创建临时表,只需创建它们并让它们等待数据。这假设临时表数据是会话的本地数据(在oracle中就是这种情况,并且存在临时表存在的原因)。
另外,我会选择不在程序之间传递表名。几乎总有一种更好的方式,无论如何都是禁止的。如果你的印象是你需要变量临时表名,那么你真的想要在临时表中添加另一个列(你甚至可以称之为#34; temp_table_name",尽管它几乎肯定意味着不同的东西)。然后你可以传递" temp_table_name"周围和选择需要where temp_table_name = ...
,插入必须填充这个额外的列。