如何在SQL Server中删除表变量?我是否应该这样做?


123

我在脚本中有一个表变量(不是存储过程)。两个问题:

  1. 如何删除表变量?删除表@varName会出现“错误的snytax”错误。
  2. 我应该一直这样做吗?我听说这是个好习惯。这样的小脚本真的有必要吗?

这是我的代码:

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work

您不能自己丢掉它们,所以问题的第二部分不适用。
马丁·史密斯,

Answers:


189

表变量自动是本地变量,并且会自动删除-您不必担心。


17
+1-同样,即使您愿意也不能删除它们-只要会话打开,它们就会持续存在,就像其他任何变量一样。它们也不受交易的影响。
JNK

10
@JNK指出它们不受事务影响很重要,您可以使用表变量来保存数据并在错误导致回滚后将其写入日志表。
HLGEM 2011年

3
不,它不一样。临时表参与事务。
Paul Perigny 2011年

它们也不像CTE一样。
霍根

您不能删除它们,但可以删除它们'delete @projectList';)
RK Sharma

29

表变量就像int或varchar变量一样。

您无需丢弃它们。它们具有与int或varchar变量相同的作用域规则

变量的范围是可以引用该变量的Transact-SQL语句的范围。变量的范围从声明的点一直持续到声明它的批处理或存储过程的末尾。


1
您知道表变量创建的tempdb对象超出范围时是否被清除?还是服务器要等到会话关闭后才能清理它们?
StriplingWarrior

21

如果有人遇到此问题……而您确实需要像在循环中一样将其删除,则可以从表变量中删除所有内容:

DELETE FROM @tableVariableName

7

但是你们都忘了提到,如果在循环内使用变量表,则在清空循环内的数据之前需要清空(删除@table)。


3

就像TempTables一样,还在TempDB中创建一个本地表变量。表变量的范围是在其中声明它的批处理,存储过程和语句块。它们可以在过程之间作为参数传递。当您关闭在其上创建它们的会话时,它们将被自动删除。


#temp表与@table变量不同,它不会在补丁程序或作用域结束后自动删除,仅当它在存储过程中创建并且存储过程执行完毕时才自动删除
Abou-Emish

1

这是一个解决方案

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

在SQL Server 2014 Christophe上工作正常

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.