Usuń tabelę tymczasową, jeśli istnieje

96

Mam dwa wiersze kodu w SQL, które tworzą dwie tabele w locie, muszę zrobić coś takiego

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

moje wiersze są następujące

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

jak mogę zastosować tę koncepcję do tych dwóch tabel w mojej procedurze?

user710502
źródło

Odpowiedzi:

200

Od SQL Server 2016 możesz po prostu użyć

 DROP TABLE IF EXISTS ##CLIENTS_KEYWORD

W poprzednich wersjach możesz użyć

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

Możesz także rozważyć obcinanie tabeli zamiast porzucania i ponownego tworzenia.

IF OBJECT_ID('tempdb..##CLIENTS_KEYWORD', 'U') IS NOT NULL
  TRUNCATE TABLE ##CLIENTS_KEYWORD
ELSE
  CREATE TABLE ##CLIENTS_KEYWORD
  (
     client_id INT
  ) 
Martin Smith
źródło
czy możesz też zamieścić skrót poniżej tego podejścia, może mi to pomóc na lepsze :) dziękuję
user710502
hmm z jakiegoś powodu, kiedy go wykonuję, mówi, że ## CLIENTS_KEYWORD to nieprawidłowa nazwa obiektu
user710502
@user - z jakiej wersji SQL Server korzystasz? Korzystam z SQL Server 2008 i (myślę, że) przetestowałem oba pod kątem przypadku, gdy tabela istniała i nie istniała. Może być konieczne zawinięcie kreacji w plik, EXECaby parser nie narzekał na poprzednie wersje. tj. użycieEXEC('CREATE TABLE ##CLIENTS_KEYWORD(client_id INT)')
Martin Smith
+1OBJECT_ID IS NULLzamiast tempdb.sys.tableszapytania.
dakab
1
@TobySpeight - pytanie dotyczy tabel tymczasowych. Większość z tych punktów ma ograniczone znaczenie.
Martin Smith
13

Sprawdź, czy istnieje, pobierając jego identyfikator_obiektu:

if object_id('tempdb..##clients_keyword') is not null
    drop table ##clients_keyword
Derek Kromm
źródło
0

To, o co prosiłeś, to:

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) 

Ponieważ zawsze będziesz tworzył tabelę, niezależnie od tego, czy tabela zostanie usunięta, czy nie; nieco zoptymalizowanym rozwiązaniem jest:

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
źródło