删除临时表(如果存在)

Posted

技术标签:

【中文标题】删除临时表(如果存在)【英文标题】:Drop a temporary table if it exists 【发布时间】:2011-11-07 17:26:01 【问题描述】:

我在 SQL 中有两行代码可以即时创建两个表,我需要做一些类似的事情

IF TABLE EXISTS 
    DROP IT AND CREATE IT AGAIN
ELSE
    CREATE IT

我的台词如下

CREATE TABLE ##CLIENTS_KEYWORD(client_id int)     
CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int)   

如何在我的过程中为这两个表应用这个概念?

【问题讨论】:

What's the best way to determine if a temporary table exists in SQL Server?的可能重复 check if temp table exist and delete if it exists before creating a temp table的可能重复 【参考方案1】:

从 SQL Server 2016 开始,您可以使用

 DROP TABLE IF EXISTS ##CLIENTS_KEYWORD

您可以在以前的版本中使用

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') IS NOT NULL
/*Then it exists*/
DROP TABLE ##CLIENTS_KEYWORD
CREATE TABLE ##CLIENTS_KEYWORD
(
   client_id INT
)

您也可以考虑截断表格而不是删除并重新创建。

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') IS NOT NULL
  TRUNCATE TABLE ##CLIENTS_KEYWORD
ELSE
  CREATE TABLE ##CLIENTS_KEYWORD
  (
     client_id INT
  ) 

【讨论】:

你也可以在这个方法下面发布截断,它可能对我有更好的帮助:)谢谢 嗯,由于某种原因,当我执行它时,它说 ##CLIENTS_KEYWORD 是无效的对象名称 @user - 你使用的是什么版本的 SQL Server?我在 SQL Server 2008 上并且(我想我)测试了表存在和不存在的情况。它可能需要将 create 包装在 EXEC 中,这样解析器就不会抱怨以前的版本。即使用EXEC('CREATE TABLE ##CLIENTS_KEYWORD(client_id INT)') +1 用于OBJECT_ID IS NULL 而不是tempdb.sys.tables 查询。 @TobySpeight - 问题是关于临时表的。这些观点中的大多数与此相关性有限。【参考方案2】:

通过检索其 object_id 来检查是否存在:

if object_id('tempdb..##clients_keyword') is not null
    drop table ##clients_keyword

【讨论】:

【参考方案3】:

你要求的是:

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD') IS NOT NULL
    BEGIN
       DROP TABLE ##CLIENTS_KEYWORD

       CREATE TABLE ##CLIENTS_KEYWORD(client_id int)

    END
ELSE
   CREATE TABLE ##CLIENTS_KEYWORD(client_id int) 

IF OBJECT_ID('tempdb..##TEMP_CLIENTS_KEYWORD') IS NOT NULL
    BEGIN
       DROP TABLE ##TEMP_CLIENTS_KEYWORD

       CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int)

    END
ELSE
   CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int) 

因为你总是要创建表,不管表是否被删除;稍微优化的解决方案是:

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD') IS NOT NULL
   DROP TABLE ##CLIENTS_KEYWORD

CREATE TABLE ##CLIENTS_KEYWORD(client_id int) 

IF OBJECT_ID('tempdb..##TEMP_CLIENTS_KEYWORD') IS NOT NULL
   DROP TABLE ##TEMP_CLIENTS_KEYWORD

CREATE TABLE ##TEMP_CLIENTS_KEYWORD(client_id int) 

【讨论】:

以上是关于删除临时表(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章

删除临时表(如果存在)

检查是否存在临时表,并在创建临时表之前删除它是否存在

如何判断一个临时表是不是存在呢?

SQLServer 中的存储过程中判断临时表是否存在,存在则删除临时表

SQL Server 表变量和临时表的区别

判断临时表是否存在,存在就删除