我有一个存储过程,它使用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'
如果可能的话,我希望将临时表用于另一个存储过程,以将其值用于其他目的,并避免做两次同样的事情。
如果不可能,那么您可以建议我在不同的存储过程中重用表数据的最佳方法。另外,我知道我无法在存储过程中创建视图,因此视图已不在讨论中。
答案 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_B
,sp_A
中声明的临时表也将在sp_B
中可用。