【问题标题】:It is possible for created temporary table by a stored procedure to be used in another stored procedure?存储过程创建的临时表是否可以在另一个存储过程中使用?
【发布时间】:2012-09-07 17:20:20
【问题描述】:

我有一个存储过程,它使用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'

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

如果不可能,那么您能否建议我在不同的存储过程中重用表数据的最佳方法。另外,我知道我不能在存储过程中创建视图,然后视图不在讨论范围内。

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    使用 GLOBAL 临时表

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

    您可以通过在表名前加上双哈希(##)来创建全局临时表

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

    编辑:

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

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

    【讨论】:

    • 那么存储过程创建的表在执行结束时不会被删除?
    • +1,也许还告诉 OP 全局/本地临时表和表变量之间的区别。
    • @SnakeEyes:不,你可以在其他程序中使用它
    • 好的,那太好了。该临时表将保存在tempdb 数据库中吗?还是别的地方?
    • @SnakeEyes:它只会在 tempDB 中
    【解决方案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
    

    产生两行。但是,我不确定这是否是您想要做的 - 您的示例只定义了一个临时表并且从不访问它。

    【讨论】:

    • 这两个存储过程之间没有链接。但很高兴知道。
    【解决方案3】:

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

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

    普通临时表(用# 声明,如#temptale)可用于嵌套过程。如果一个存储过程sp_A 调用另一个存储过程sp_B,在sp_A 中声明的临时表也将在sp_B 中可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多