有没有办法创建一个临时表,每次在SQL中覆盖自己

时间:2016-06-16 15:47:13

标签: sql sql-server

我有一个查询将数据加载到临时表中然后检索它。当我尝试再次运行查询而不是遇到“#(temptablename)已经存在”的问题时,有没有办法让我的临时表覆盖自己?提前谢谢。

4 个答案:

答案 0 :(得分:2)

在加载数据之前,查看临时表是否已存在并在每次运行脚本时删除它。

IF OBJECT_ID('dbo.temp_table','U') IS NOT NULL 
DROP TABLE dbo.temp_table
GO
/*
 your script here
 --the table can be re-created using SELECT ... INTO
*/

答案 1 :(得分:1)

您可以使用表变量。主要缺点是你必须定义结构;您无法使用SELECT ... INTO来创建表变量。您必须声明表结构并使用INSERT INTO ... SELECT

DECLARE @TempContacts TABLE
(
   Id        INT,
   FirstName VARCHAR(100),
   LastName  VARCHAR(100),
   Email     VARCHAR(100)
);

INSERT INTO @TempContacts
SELECT 
    Id, 
    FirstName, 
    LastName, 
    Email 
FROM Contacts
WHERE Id = @ContactId

答案 2 :(得分:0)

在脚本中删除临时表也有合理的理由。从理论上讲,SQL Server在脱离上下文时会删除该表。实际上,这样做并没有什么坏处,它可以(但不总是)快速完成垃圾收集过程。我通常也会检查脚本的顶部(尽管不在程序的顶部)。

如果OBJECT_ID(N'tempdb ..#temp_table',N'U')IS NOT NULL DROP TABLE #temp_table; 走 CREATE TABLE #temp_table([field] [int]); - 使用#temp_table 如果OBJECT_ID(N'tempdb ..#temp_table',N'U')不是NULL DROP TABLE #temp_table; GO

答案 3 :(得分:0)

也许值得考虑table variable。如果您正在运行更新版本的SQL Server,则性能可能与临时表相当。

示例(来自上面的链接)

declare @TableVar table (   NewPK int identity(1,1),    CustomerID nchar(5) NOT NULL  )

Insert Into @TableVar (CustomerID) Select   CustomerID From Customers

Select  Top 5 * from    @TableVar