存储过程创建的临时表是否可以在另一个存储过程中使用?

时间:2012-09-07 06:32:42

标签: sql sql-server stored-procedures

我有一个存储过程,它使用CONTAINSTABLE创建一个包含已找到索引的临时表(我放了一段存储过程代码):

CREATE TABLE #tmpTable(
  ID INT,
  RANK INT)

 SELECT @query = ' 
  SELECT 
    DISTINCT ID AS T_ID,
   indexTable.RANK AS RANK
  FROM 
   MyTable
  INNER JOIN
   CONTAINSTABLE(MyTable, (*), "ISABOUT('example*')") AS indexTable
  ON
   MyTable.ID = indexTable.[KEY]
  ORDER BY RANK DESC'

如果可能的话,我希望将临时表用于另一个存储过程,以将其值用于其他目的,并避免做两次同样的事情。

如果不可能,那么您可以建议我在不同的存储过程中重用表数据的最佳方法。另外,我知道我无法在存储过程中创建视图,因此视图已不在讨论中。

3 个答案:

答案 0 :(得分:4)

使用GLOBAL临时表

CREATE TABLE ##tmpTable(
  ID INT,
  RANK INT)

您可以通过在表名前添加双哈希(##)

来创建全局临时表

一旦连接创建了这个表,就像永久表一样,任何用户都可以通过任何连接使用它。只有在关闭所有连接后才能删除它。

编辑:

为了检查是否存在临时表,您可以使用以下语句/ check。

if object_id('tempdb..##tmpTable') is not null
begin
    drop table ##tmpTable
end

答案 1 :(得分:2)

如果您的第一个存储过程调用第二个存储过程,则第二个过程可以访问第一个存储过程创建的任何临时表:

create procedure SP_1
as
    create table #T1 (ID int not null)
    insert into #T1 (ID) values (1),(2)

    exec SP_2
go
create procedure SP_2
as
    select * from #T1
go
exec SP_1

生成两行。但是,我不确定这是不是你要做的 - 你的例子只定义一个临时表,永远不会访问它。

答案 2 :(得分:0)

有两种类型的临时表:a)临时表和b)全局临时表。

可以在所有程序中使用全局临时表(使用##声明,如##globalTempTable)。

可以在嵌套过程中使用普通临时表(使用#声明#temptale)。如果sproc sp_A调用另一个sproc sp_Bsp_A中声明的临时表也将在sp_B中可用。