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