【问题标题】:Accessing temp table outside Stored Procedure在存储过程之外访问临时表
【发布时间】:2016-11-15 10:07:23
【问题描述】:

我有以临时表形式输出的存储过程

Create Proc Hello (@id int,@name nvarchar(30))
as
begin 
If (OBJECT_ID('tempdb..#Welcome')  Is Not Null) Drop Table #Welcome
select * into #Welcome from hello where id=@id
If (OBJECT_ID('tempdb..#Welcomes')  Is Not Null) Drop Table #Welcomes
select * into #Welcomes from hello where name=@name

end

现在我得到了 2 个临时表作为我将在数据集中使用的结果..

现在我需要在另一个存储过程中访问这个#welcome ..我的意思是

    Create Proc HelloThere(@ids int,@name nvarchar(10)) 
    as
    begin 
      exec hello @id = @ids ,@name =@name

      //select * from #Welcome(Here i need to access the #Welcome so i can perform inner join something like below//

   select * from #welcome inner join Atable on #welcome.id=Atable.id

   end

【问题讨论】:

  • 临时表是在过程之间共享数据的一种方式,但不是唯一的一种,也不是最好的一种。请参阅 here 以获取完整概述,包括您如何使用临时表。
  • 感谢 Jereon 非常有帮助且内容丰富

标签: sql-server stored-procedures


【解决方案1】:

在存储过程中创建的临时表会在存储过程完成时自动删除,因此调用存储过程将无法使用该临时表。

保留临时表的一种方法是在调用过程中显式创建表(使用CREATE TABLESELECT INTO),然后将其加载到被调用过程中:

CREATE PROC Hello @id int,@name nvarchar(30)
AS
INSERT INTO #Welcome SELECT * FROM hello where id=@id;
GO

CREATE PROC HelloThere(@ids int,@name nvarchar(10)) 
AS
If OBJECT_ID(N'tempdb..#Welcome', 'U') IS NOT NULL DROP TABLE #Welcome;

SELECT * INTO #welcome FROM hello WHERE 0 = 1;

EXEC hello @id = @ids ,@name =@name;

SELECT * FROM #welcome INNER JOIN Atable ON #welcome.id=Atable.idl

GO

正如@JeroenMostert 在 cmets 中提到的,您可以细读http://www.sommarskog.se/share_data.htmlHow to Share Data between Stored Procedures 以了解其他技术。

【讨论】:

    【解决方案2】:

    如果需要在程序之外使用,您可以创建一个全局临时表(2“#”):

    CREATE PROC TEST AS
        SELECT TOP 10 * INTO ##GLOBAL_TABLE FROM SYS.all_objects
    GO
    EXEC TEST
    SELECT * FROM ##GLOBAL_TABLE --It works
    

    请注意其他可能尝试使用相同名称并产生错误的进程(或删除您的全局表并以其他方式使用它)

    您可以使用创建过程之后的日期创建表(将##USERS 更改为##USERS_20220101 之类的名称)

    【讨论】:

      猜你喜欢
      • 2018-01-23
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      相关资源
      最近更新 更多