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

时间:2011-04-13 18:00:52

标签: sql sql-server table-variable

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

  1. 如何删除表变量?删除表@varName给出“不正确的snytax”错误。
  2. 我应该经常这样做吗?我听说这是一个很好的做法。像这样的小脚本真的有必要吗?
  3. 这是我的代码:

    Declare @projectList table(
        name varchar(40) NOT NULL);
    
    Insert Into @projectList
    Values ('BCR-00021')
    
    Select *
    From @projectList
    
    Drop Table @projectList -- does not work
    

8 个答案:

答案 0 :(得分:162)

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

答案 1 :(得分:29)

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

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

  

变量的范围是可以引用变量的Transact-SQL语句的范围。变量的范围从声明它的位置延迟到声明它的批处理或存储过程的结尾。

答案 2 :(得分:14)

如果有其他人遇到这个......你真的需要像在循环中一样删除它,你可以从表变量中删除所有:

DELETE FROM @tableVariableName

答案 3 :(得分:4)

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

答案 4 :(得分:3)

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

答案 5 :(得分: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)

答案 6 :(得分:1)

温度表变量保存到temp.db,范围限于当前执行。因此,与删除Temp表(例如删除表#tempTable)不同,我们不必显式删除Temp表变量@tempTableVariable。 sql服务器会自动照顾它。

drop table @tempTableVariable -- Invalid

答案 7 :(得分: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