【问题标题】:Is there a way to pass temporary tables across the stored procedures有没有办法跨存储过程传递临时表
【发布时间】:2014-09-25 14:36:09
【问题描述】:

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

第三个和第四个存储过程的相似之处是需要前面存储过程的结果。 有没有办法跨存储过程传递临时表?

【问题讨论】:

  • 有什么理由不只写一个proc吗?
  • 它是 1 Sp,但我们将它分成 4,以便在需要时更容易更改
  • @Mwright,这是 SQL server 还是 oracle,我的示例在 sql server 上运行良好,但不确定 oracle。

标签: sql stored-procedures


【解决方案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

【讨论】:

  • 刚刚花了一个小时试图弄清楚如何从 SP 填充临时表,我什至没有考虑到我只需要我的大而整洁的结果格式来获得最终结果,所以我可以调用该过程以在需要的地方返回该过程,并在过程中以任何杂乱的格式设置临时变量。感谢您的建议!
【解决方案2】:

在您当前的 SP1 中,您可以创建临时表,将名称传递给第二个存储过程,如下所示

SP1 代码

IF OBJECT_ID('tempdb.dbo.#TempTable1')  IS NOT NULL 
        DROP TABLE #TempTable1
EXEC SP2  N'#TempTable1'

在 SP2 中,您可以将值插入到调用 SP 可用的 #TempTable1 中

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

【讨论】:

    【解决方案3】:

    您的问题听起来更像是一个答案而不是一个问题。照你说的做。

    您不需要将临时表中的数据从一个过程传递到下一个过程。数据就在那里。在一个过程中,您写入临时表,在下一个过程中,您从临时表中读取。

    我也不会动态创建临时表,只是创建它们并让它们等待数据。这假设临时表数据是会话本地的(在 oracle 中就是这种情况,并且在某种程度上是临时表存在的原因)。

    另外我会选择反对在过程之间传递表名。几乎总是有更好的方法,而且无论如何都是禁忌。如果您的印象是需要可变临时表名称,那么您真的想在临时表中添加另一列(您甚至可以将其称为“temp_table_name”,尽管它几乎可以肯定意味着不同的东西)。然后你可以传递“temp_table_name”,选择需要where temp_table_name = ...,插入必须填充这个额外的列。

    【讨论】:

    • 我不确定这是否可行。我的理解是,一旦填充临时表的 proc 完成执行,临时表就会消失。不过,我必须尝试一下才能确定。
    • 在 oracle 中它不会并且如果其他 RDBMS 做不同的事情会感到惊讶。数据可能会在提交时被删除,也可能会一直保留到明确删除(取决于它们的创建方式)。我假设您的意思是临时表,而不是代码中的某些数据结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2014-06-11
    • 2015-11-07
    • 2021-12-13
    相关资源
    最近更新 更多