141

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

  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
4

8 回答 8

217

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

于 2011-04-13T18:01:40.597 回答
35

如果其他人遇到这个......并且您确实需要像在循环中那样删除它,您可以从表变量中删除所有内容:

DELETE FROM @tableVariableName
于 2017-08-02T08:28:09.220 回答
31

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

你不需要丢弃它们。它们具有与 int 或 varchar 变量相同的范围规则

变量的范围是可以引用该变量的 Transact-SQL 语句的范围。变量的范围从声明它的那一刻开始一直持续到声明它的批处理或存储过程结束。

于 2011-04-13T18:04:22.453 回答
8

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

于 2017-04-27T21:11:04.400 回答
3

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

于 2015-05-15T07:01:05.267 回答
1

临时表变量保存到 temp.db 中,范围仅限于当前执行。因此,与删除临时表(例如删除表#tempTable)不同,我们不必显式删除临时表变量@tempTableVariable。它由 sql server 自动处理。

drop table @tempTableVariable -- Invalid
于 2020-09-29T21:20:11.470 回答
0

这是一个解决方案

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 上运行良好

于 2019-04-11T08:16:19.230 回答
0

实际上,您不需要删除@local_variable.

但是如果你使用#local_table,它是可以做到的,例如能够多次重新执行查询很方便。

SELECT *
INTO #recent_records
FROM dbo.my_table t
WHERE t.CreatedOn > '2021-01-01'
;

SELECT *
FROM #recent_records
;

/*
  can DROP here, otherwise will fail with the following error
  on re-execution in the same window (I use SSMS DB client):

  Msg 2714, Level ..., State ..., Line ...
  There is already an object named '#recent_records' in the database.
*/
DROP TABLE #recent_records
;

您还可以将 SELECT 语句放在 TRANSACTION 中,以便能够在没有显式 DROP 的情况下重新执行:

BEGIN TRANSACTION

  SELECT *
  INTO #recent_records
  FROM dbo.my_table t
  WHERE t.CreatedOn > '2021-01-01'
  ;

  SELECT *
  FROM #recent_records
  ;

ROLLBACK
于 2021-01-12T17:15:04.773 回答