我是否需要删除存储过程中声明的表变量?

时间:2014-02-12 16:05:38

标签: sql-server tsql stored-procedures

如果我

,则在存储过程中
DECLARE @tmpClientTable TABLE

我需要再次放弃吗?或者它会在下次存储的proc运行时被覆盖。

如果其他人也运行了存储过程会发生什么......那会是一个单独的表吗?

4 个答案:

答案 0 :(得分:4)

您不需要(实际上也不能)明确删除它。

自动处理表变量的创建和删除。

在存储过程中,可以缓存表变量,而不是重复删除和创建表变量。有关详情,请参阅Temporary Table Caching Explained

并发用户将获得单独的执行上下文和表变量的单独实例。

答案 1 :(得分:2)

这是一个表变量。它不能/不需要丢弃。

它在存储过程中具有本地范围,这意味着运行相同PROC的任何并发连接将彼此隔离。

答案 2 :(得分:2)

表变量在执行后立即下降。

例如:

DECLARE @Table TABLE( 
name varchar(30) NOT NULL, 
location varchar(30) NOT NULL 
);

INSERT INTO @Table VALUES( 'John', 'Neveda')

SELECT * FROM @Table
go     

执行上述操作后,请在同一会话中尝试:

DECLARE @Table TABLE( 
name varchar(30) NOT NULL, 
location varchar(30) NOT NULL ,
locationB varchar(30) NOT NULL 
);

INSERT INTO @Table VALUES( 'John', 'Neveda', 'LasVegas')

SELECT * FROM @Table

在会话结束前不会删除临时表。 LocalTempTables Vs GlobalTempTables

答案 3 :(得分:0)

这是#TEMP表语法的一个版本。

IF OBJECT_ID('tempdb..#TempCustomer') IS NOT NULL
begin
        drop table #TempCustomer
end


CREATE TABLE #TempCustomer
( 
  [CustomerID] nchar(5)
, [CompanyName] nvarchar(40)
)


IF OBJECT_ID('tempdb..#TempCustomer') IS NOT NULL
begin
        drop table #TempCustomer
end

你不能删除@variable表。