Suelta una tabla temporal si existe

96

Tengo dos líneas de código en SQL que crean dos tablas sobre la marcha, necesito hacer algo como

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

mis lineas son las siguientes

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

¿Cómo puedo aplicar ese concepto para estas dos tablas en mi procedimiento?

usuario710502
fuente

Respuestas:

200

Desde SQL Server 2016 puede usar

 DROP TABLE IF EXISTS ##CLIENTS_KEYWORD

En versiones anteriores puede utilizar

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

También podría considerar truncar la tabla en lugar de soltarla y recrearla.

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') IS NOT NULL
  TRUNCATE TABLE ##CLIENTS_KEYWORD
ELSE
  CREATE TABLE ##CLIENTS_KEYWORD
  (
     client_id INT
  ) 
Martin Smith
fuente
¿También puede publicar el truncamiento debajo de este enfoque, podría ayudarme a mejorar :) gracias
user710502
hmm, por alguna razón, cuando lo ejecuto, dice que ## CLIENTS_KEYWORD es un nombre de objeto no válido
usuario710502
@user - ¿En qué versión de SQL Server estás? Estoy en SQL Server 2008 y (creo que) probé tanto en el caso de que la tabla existiera y no existiera. Es posible que deba envolver la creación en un EXECpara que el analizador no se queje de versiones anteriores. ie useEXEC('CREATE TABLE ##CLIENTS_KEYWORD(client_id INT)')
Martin Smith
+1 para en OBJECT_ID IS NULLlugar de tempdb.sys.tablesconsulta.
dakab
1
@TobySpeight: la pregunta es sobre tablas temporales. La mayoría de estos puntos tienen una relevancia limitada para eso.
Martin Smith
13

Verifique la existencia recuperando su object_id:

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

Lo que pediste es:

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) 

Dado que siempre va a crear la tabla, independientemente de si la tabla se elimina o no; una solución ligeramente optimizada es:

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
fuente