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

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

  1. 如何删除表变量? 删除 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
164609 次浏览

表变量是自动本地的,并且自动删除——您不必担心这一点。

表变量就像 int 或 varchar 变量。

您不需要删除它们,它们具有与 int 或 varchar 变量相同的 范围规则

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

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

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

如果其他人遇到这个问题... 你真的需要像循环中 while 那样删除它,你可以直接从 table 变量中删除:

DELETE FROM @tableVariableName

这里有一个解决方案

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;

在 SQLServer2014上运行良好 克里斯托弗

临时表变量保存到 tem.db 中,范围限制为当前执行。因此,与删除 Temp 表格(例如删除 table # temTable)不同,我们不必显式删除 Temp table variable@temTablevariable。它由 sql 服务器自动处理。

drop table @tempTableVariable -- Invalid

事实上,你不需要放弃 @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