有没有办法在存储过程中传递临时表

时间:2014-09-25 14:36:10

标签: sql stored-procedures

我有4个存储过程。我需要获取第一个存储过程的结果(2个临时表)并将其传递给第二个存储过程。这些临时表需要在第二个存储过程的from子句中使用。

相似性第三和第四个存储过程需要先前存储过程的结果。 有没有办法在存储过程中传递临时表?

3 个答案:

答案 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 = ...,插入必须填充这个额外的列。