Jak upuścić tabelę, jeśli istnieje?

721

Nazwa tabeli to Scores.

Czy poprawne jest wykonanie następujących czynności?

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores
tmaster
źródło

Odpowiedzi:

1377

Czy poprawne jest wykonanie następujących czynności?

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores

Nie. Spowoduje to upuszczenie tabeli tylko wtedy, gdy zawiera ona wiersze (i spowoduje błąd, jeśli tabela nie istnieje).

Zamiast tego możesz użyć stałego stołu

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL 
  DROP TABLE dbo.Scores; 

Lub, do tymczasowego stołu możesz użyć

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 

SQL Server 2016+ ma lepszy sposób, używając DROP TABLE IF EXISTS …. Zobacz odpowiedź @Jovan .

Martin Smith
źródło
137
Fwiw - 'U'Drugi parametr najwyraźniej oznacza „Szukaj tylko obiektów o tej nazwie, które są tabelami”. Jedno źródło . To OBJECT_ID('TableName')nie jest złe , ale też nie jest niesamowicie precyzyjne, dlatego 'U'w doskonałej odpowiedzi @ Martina.
ruffin
7
Odnośnie drugiego param; oto inne źródło , użyłem „V” dla Widoku.
The Red Pea
4
HI, czy możesz mi wyjaśnić, co oznacza ten drugi parametr w OBJECT_ID („tempdb.dbo. # T”, „U”), na przykład to „U”?
Zvonimir Tokic
9
@ZvonimirTokic oznacza „Tabela zdefiniowana przez użytkownika”. „IT” byłoby wewnętrzną tabelą zdefiniowaną przez system. Pełna lista znajduje się tutaj msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith
151

ANSI SQL / wieloplatformowy sposób polega na wykorzystaniu INFORMACJE_SCHEMA , która została zaprojektowana specjalnie do przeszukiwania metadanych dotyczących obiektów w bazach danych SQL.

if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
    drop table dbo.Scores;

Większość nowoczesnych serwerów RDBMS zapewnia co najmniej podstawową obsługę INFORMACJE_SCHEMA, w tym: MySQL , Postgres , Oracle , IBM DB2 i Microsoft SQL Server 7.0 (i nowsze) .

Jveazey
źródło
Czy if existsansi jest zgodne?
Martin Smith,
8
Uważaj, jeśli masz więcej niż jeden schemat w bazie danych. Konieczne może być sprecyzowanie, które [wyniki] wykrywasz i usuwasz. Np. GDZIE TABLE_NAME = „Wyniki” I TABLE_SCHEMA = „dbo”
Andrew Jens,
@kiquenet Zasadniczo tak, ale nie przy użyciu if istnieje - ponieważ zatrzymuje się, gdy tylko zwróci jeden wiersz. Ale ja osobiście zawsze wybieram 1.
Harag,
68

Widziałem tak wiele, że tak naprawdę nie działają. po utworzeniu tabeli tymczasowej należy ją usunąć z tempdb!

Jedyny działający kod to:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"
Biondo86
źródło
3
Dzięki, zmieniam się, dbożeby tempdbto działało. Chciałbym również zasugerować dodanie odpowiedzi 'u'wymienionych w komentarzach przyjętej odpowiedzi. Zatem pełne wyrażenie IF wyglądałoby tak:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz
38

W SQL Server 2016 (13.x) i nowszych

DROP TABLE IF EXISTS dbo.Scores

We wcześniejszych wersjach

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL 
DROP TABLE dbo.Scores; 

U jest twójtable type

Farhan Yaseen
źródło
28

Lub:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores
sventevit
źródło
4
Możesz użyć sys.tables od 2005 roku, aby uprościć to:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker
26

Mam nadzieję, że to pomoże:

begin try drop table #tempTable end try
begin catch end catch
Vlad
źródło
22

Napisałem mały UDF, który zwraca 1, jeśli jego argumentem jest nazwa istniejącej tabeli, w przeciwnym razie 0:

CREATE FUNCTION [dbo].[Table_exists]
(
    @TableName VARCHAR(200)
)
    RETURNS BIT
AS
BEGIN
    If Exists(select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = @TableName)
        RETURN 1;

    RETURN 0;
END

GO

Aby usunąć tabelę, Userjeśli istnieje, nazwij ją tak:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Mansfield
źródło
Co z tym samym imieniem, ale innym schematem? Najlepszy sposób jest tutaj: stackoverflow.com/a/33497857/956364
Protiguous
9

Proste jest to, że:

IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName

gdzie dbo.TableNamejest twój pożądany stół, a „U” jest typetwój table.

Arsman Ahmad
źródło
6
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
    DROP TABLE Scores
GO
Alfaiz Ahmed
źródło
4

Używam:

if exists (select * 
           from sys.tables 
           where name = 'tableName' 
           and schema_id = schema_id('dbo'))
begin
    drop table dbo.tableName
end
użytkownik7463511
źródło
3

Jest łatwiejszy sposób

DROP TABLE IF EXISTS table_name;
Alexandre Oliveira
źródło
-1

Lepszy wizualny i łatwy sposób, jeśli używasz Visual Studio, wystarczy otworzyć z paska menu,

Widok -> Eksplorator obiektów SQL Server

powinien się otworzyć jak pokazano tutaj

wprowadź opis zdjęcia tutaj

Wybierz i kliknij prawym przyciskiem myszy tabelę, którą chcesz usunąć, a następnie usuń. Taki ekran powinien zostać wyświetlony. Kliknij Aktualizuj bazę danych, aby potwierdzić.

wprowadź opis zdjęcia tutaj

Ta metoda jest bardzo bezpieczna, ponieważ zapewnia informacje zwrotne i ostrzega o wszelkich relacjach usuniętej tabeli z innymi tabelami.

Githithu Wambura
źródło
5
To pytanie jest związane SQL, a nie powiązane Visual Studio. Dlatego ta odpowiedź nie ma znaczenia dla tego pytania.
Adnan Sharif,
-8

Zrób tak, to najprostszy sposób.

qry będzie twoje zapytanie, cokolwiek chcesz na liście wyboru.

set @qry = ' select * into TempData from (' + @qry + ')Tmp  '

exec (@qry)

select * from TempData 

drop table TempData
Rajan s
źródło
4
Czy to tylko ja, czy to wygląda na skłonność do iniekcji? Proszę skomentuj.
g00dy
5
Nie ma to również nic wspólnego z pytaniem
Martin Smith,