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?



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
  ) 

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

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) 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.