2

我有一个存储过程,它使用 like 创建一个带有找到索引的临时表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'

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

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

4

3 回答 3

4

使用 GLOBAL 临时表

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

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

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

编辑:

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

if object_id('tempdb..##tmpTable') is not null
begin
    drop table ##tmpTable
end
于 2012-09-07T06:35:59.270 回答
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

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

于 2012-09-07T06:42:58.750 回答
0

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

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

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

于 2012-09-07T09:20:20.690 回答