删除临时表(如果存在)


96

我在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)   

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



Answers:


200

在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是无效的对象名称
user710502

@user-您使用的是哪个版本的SQL Server?我正在使用SQL Server 2008,并且(认为我)测试了该表是否存在的情况。可能需要将创建内容包装在中,EXEC以便解析器不会抱怨以前的版本。即使用EXEC('CREATE TABLE ##CLIENTS_KEYWORD(client_id INT)')
马丁·史密斯

+1 OBJECT_ID IS NULL代替tempdb.sys.tables查询。
dakab 2014年

1
@TobySpeight-问题是关于临时表。这些要点大多与此无关。
马丁·史密斯

13

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

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

0

您要求的是:

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) 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.