Elimine uma tabela temporária se ela existir

96

Tenho duas linhas de código em SQL que criam duas tabelas dinamicamente, preciso fazer algo como

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

minhas falas são as seguintes

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

como posso aplicar esse conceito para essas duas tabelas em meu procedimento?

user710502
fonte

Respostas:

200

No SQL Server 2016, você pode apenas usar

 DROP TABLE IF EXISTS ##CLIENTS_KEYWORD

Em versões anteriores, você pode usar

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

Você também pode considerar truncar a tabela em vez de soltá-la e recriá-la.

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') IS NOT NULL
  TRUNCATE TABLE ##CLIENTS_KEYWORD
ELSE
  CREATE TABLE ##CLIENTS_KEYWORD
  (
     client_id INT
  ) 
Martin Smith
fonte
você também pode postar o truncamento abaixo dessa abordagem, isso pode me ajudar para melhor :) obrigado
user710502
hmm por algum motivo, quando eu o executo, ele diz que ## CLIENTS_KEYWORD é um nome de objeto inválido
user710502
@user - Qual versão do SQL Server você está usando? Estou no SQL Server 2008 e (acho que sim) testei ambos para o caso de que a tabela existia e não existia. Pode ser necessário envolver o create em um EXECpara que o analisador não reclame nas versões anteriores. ou seja, useEXEC('CREATE TABLE ##CLIENTS_KEYWORD(client_id INT)')
Martin Smith
+1 para em OBJECT_ID IS NULLvez de tempdb.sys.tablesconsulta.
Dakab
1
@TobySpeight - a questão é sobre tabelas temporárias. Muitos desses pontos são de relevância limitada para isso.
Martin Smith
13

Verifique a existência recuperando seu object_id:

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

O que você pediu é:

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) 

Visto que você sempre criará a tabela, independentemente de a tabela ser excluída ou não; uma solução ligeiramente otimizada é:

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
fonte