2011-04-13 95 views
88

我在脚本中有一个表变量(不是存储过程)。两个问题:如何在SQL-Server中删除表变量?我应该甚至这样做吗?

  1. 如何删除表变量? Drop Table @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 
+0

你无法自己删除他们,所以你的问题的第二部分不适用。 – 2011-04-13 18:02:37

回答

136

表变量是自动的本地和自动删除 - 您不必担心。

+14

+1 - 即使你愿意,你也不能**放弃它们 - 只要会话是开放的,就像其他变量一样,它们会持续存在。它们也不受交易的影响。 – JNK 2011-04-13 18:04:30

+8

@JNKs指出它们不受事务影响很重要,您可以使用表变量来保存数据并在错误导致回滚后写入日志表。 – HLGEM 2011-04-13 18:08:15

+0

很酷,有效。这对#tempTables是否一样? – jtpereyda 2011-04-13 18:39:00

27

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

你不需要放下它们。它们与int或varchar变量具有相同的scope规则

变量的范围是可引用该变量的Transact-SQL语句的范围。变量的作用域从声明的地方持续到声明的批处理或存储过程结束。

3

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

+0

#temp表不是与@table变量相同,它在修补程序或范围结束后不会自动删除,只有在存储过程内部创建并且存储过程完成执行时才会自动删除 – 2017-10-18 18:52:04

3

但是你们都忘了提及,如果在一个循环内使用一个变量表,它将需要在循环内再次加载数据之前清空(删除@table)。

3

如果别人遇到这个......你真的需要放弃它像,而在一个循环中,你可以从表变量全部删除:

DELETE FROM @tableVariableName 
相关问题