我在脚本中有一个表变量(不是存储过程)。两个问题:
这是我的代码:
Declare @projectList table(
name varchar(40) NOT NULL);
Insert Into @projectList
Values ('BCR-00021')
Select *
From @projectList
Drop Table @projectList -- does not work
答案 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