Supprimer une table temporaire si elle existe

96

J'ai deux lignes de code en SQL qui créent deux tables à la volée, je dois faire quelque chose comme

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

mes lignes sont les suivantes

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

comment puis-je appliquer ce concept à ces deux tableaux dans ma procédure?

user710502
la source

Réponses:

200

À partir de SQL Server 2016, vous pouvez simplement utiliser

 DROP TABLE IF EXISTS ##CLIENTS_KEYWORD

Sur les versions précédentes, vous pouvez utiliser

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

Vous pouvez également envisager de tronquer la table plutôt que de la supprimer et de la recréer.

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') IS NOT NULL
  TRUNCATE TABLE ##CLIENTS_KEYWORD
ELSE
  CREATE TABLE ##CLIENTS_KEYWORD
  (
     client_id INT
  ) 
Martin Smith
la source
pouvez-vous également poster la troncature ci-dessous cette approche, cela pourrait m'aider pour le mieux :) merci
user710502
hmm pour une raison quelconque lorsque je l'exécute, il dit que ## CLIENTS_KEYWORD est un nom d'objet non valide
user710502
@user - Quelle version de SQL Server utilisez-vous? Je suis sur SQL Server 2008 et (je pense que je) ai testé les deux pour le cas où la table existait et n'existait pas. Il peut avoir besoin d'encapsuler la création dans un EXECafin que l'analyseur ne se plaint pas des versions précédentes. ie utiliserEXEC('CREATE TABLE ##CLIENTS_KEYWORD(client_id INT)')
Martin Smith
+1 pour OBJECT_ID IS NULLau lieu de tempdb.sys.tablesrequête.
dakab
1
@TobySpeight - la question concerne les tables temporaires. La plupart de ces points ont une pertinence limitée à cet égard.
Martin Smith
13

Vérifiez l'existence en récupérant son object_id:

if object_id('tempdb..##clients_keyword') is not null
    drop table ##clients_keyword
Derek Kromm
la source
0

Ce que vous avez demandé, c'est:

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) 

Puisque vous allez toujours créer la table, que la table soit supprimée ou non; une solution légèrement optimisée est:

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) 
WonderWorker
la source