Wie lösche ich eine Tabelle, wenn sie existiert?

721

Der Tabellenname lautet Scores.

Ist es richtig, Folgendes zu tun?

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

Antworten:

1377

Ist es richtig, Folgendes zu tun?

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

Nein. Dadurch wird die Tabelle nur gelöscht, wenn sie Zeilen enthält (und es wird ein Fehler ausgegeben, wenn die Tabelle nicht vorhanden ist).

Stattdessen können Sie für eine permanente Tabelle verwenden

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

Oder Sie können eine temporäre Tabelle verwenden

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

SQL Server 2016+ bietet eine bessere Möglichkeit DROP TABLE IF EXISTS …. Siehe die Antwort von @Jovan .

Martin Smith
quelle
137
Fwiw - Der 'U'für den zweiten Parameter bedeutet anscheinend "Nur nach Objekten mit diesem Namen suchen, die Tabellen sind". Eine Quelle . Also OBJECT_ID('TableName')ist es nicht falsch , aber es ist auch nicht wahnsinnig präzise, ​​also 'U'in @ Martins ausgezeichneter Antwort.
Ruffin
7
In Bezug auf den zweiten Parameter; Hier ist eine andere Quelle , ich habe 'V' für eine Ansicht verwendet.
Die rote Erbse
4
HI können Sie mir erklären, was dieser zweite Parameter in OBJECT_ID ('tempdb.dbo. # T', 'U') bedeutet, zum Beispiel dieses 'U'?
Zvonimir Tokic
9
@ZvonimirTokic bedeutet "Benutzerdefinierte Tabelle". "IT" wäre eine interne, systemdefinierte Tabelle. Eine vollständige Liste finden Sie hier msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith
375

Ab SQL Server 2016 können Sie verwenden

DROP TABLE IF EXISTS dbo.Scores

Referenz: DROP IF EXISTS - Neues in SQL Server 2016

Es wird bald in der SQL Azure-Datenbank verfügbar sein.

Jovan MSFT
quelle
151

Die ANSI SQL / plattformübergreifende Methode besteht darin, INFORMATION_SCHEMA zu verwenden , das speziell zum Abfragen von Metadaten zu Objekten in SQL-Datenbanken entwickelt wurde.

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

Die meisten modernen RDBMS-Server bieten mindestens grundlegende INFORMATION_SCHEMA-Unterstützung, einschließlich: MySQL , Postgres , Oracle , IBM DB2 und Microsoft SQL Server 7.0 (und höher) .

jveazey
quelle
Ist die if existsAnsi-konform?
Martin Smith
8
Seien Sie vorsichtig, wenn Sie mehr als ein Schema in der Datenbank haben. Möglicherweise müssen Sie genau angeben, welche [Scores] Sie erkennen und löschen. ZB WHERE TABLE_NAME = 'Scores' UND TABLE_SCHEMA = 'dbo'
Andrew Jens
@kiquenet Im Allgemeinen ja, aber nicht, wenn das if existiert - da dies stoppt, sobald eine Zeile zurückgegeben wird. Aber ich persönlich wähle sowieso immer 1 aus.
Harag
68

Habe so viele gesehen, die nicht wirklich funktionieren. Wenn eine temporäre Tabelle erstellt wird, muss sie aus der temporären Datenbank gelöscht werden!

Der einzige Code, der funktioniert, ist:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"
Biondo86
quelle
3
Danke, Ändern , dboum tempdbdiese Arbeit gemacht. Ich möchte auch vorschlagen, die 'u'in den Kommentaren der akzeptierten Antwort genannten hinzuzufügen . Somit würde die vollständige IF-Anweisung folgendermaßen aussehen:IF OBJECT_ID('tempdb..#temp', 'U')
Whiteshooz
38

In SQL Server 2016 (13.x) und höher

DROP TABLE IF EXISTS dbo.Scores

In früheren Versionen

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

Du bist deintable type

Farhan Yaseen
quelle
28

Oder:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores
sventevit
quelle
4
Sie können sys.tables seit 2005 verwenden, um dies zu vereinfachen:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker
26

Ich hoffe das hilft:

begin try drop table #tempTable end try
begin catch end catch
vlad
quelle
22

Ich habe eine kleine UDF geschrieben, die 1 zurückgibt, wenn das Argument der Name einer vorhandenen Tabelle ist, andernfalls 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

Um eine vorhandene Tabelle zu löschen User, rufen Sie sie folgendermaßen auf:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Mansfield
quelle
Was ist mit dem gleichen Namen, aber einem anderen Schema? Der beste Weg ist hier: stackoverflow.com/a/33497857/956364
Protiguous
9

Einfach ist das:

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

wo die dbo.TableNamegewünschte Tabelle ist und ‚U‘ ist typeIhre table.

Arsman Ahmad
quelle
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
quelle
4

Ich benutze:

if exists (select * 
           from sys.tables 
           where name = 'tableName' 
           and schema_id = schema_id('dbo'))
begin
    drop table dbo.tableName
end
user7463511
quelle
3

Es gibt einen einfacheren Weg

DROP TABLE IF EXISTS table_name;
Alexandre Oliveira
quelle
-1

Eine bessere visuelle und einfache Möglichkeit, wenn Sie Visual Studio verwenden, öffnen Sie einfach über die Menüleiste.

Ansicht -> SQL Server-Objekt-Explorer

es sollte sich wie hier gezeigt öffnen

Geben Sie hier die Bildbeschreibung ein

Wählen Sie und klicken Sie mit der rechten Maustaste auf die Tabelle, die Sie löschen möchten, und löschen Sie sie dann. Ein solcher Bildschirm sollte angezeigt werden. Klicken Sie zur Bestätigung auf Datenbank aktualisieren.

Geben Sie hier die Bildbeschreibung ein

Diese Methode ist sehr sicher, da sie Ihnen Feedback gibt und Sie vor Beziehungen der gelöschten Tabelle zu anderen Tabellen warnt.

Githithu Wambura
quelle
5
Diese Frage bezieht sich auf SQL, nicht auf Visual Studio. Daher ist diese Antwort für diese Frage irrelevant.
Adnan Sharif
-8

Tun Sie dies so, es ist der einfachste Weg.

qry wird Ihre eigene Abfrage sein, was auch immer Sie in der Auswahlliste wollen.

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

exec (@qry)

select * from TempData 

drop table TempData
Rajan s
quelle
4
Ist es nur ich oder sieht das nach einer Injektion aus? Bitte kommentieren.
g00dy
5
Es hat auch nichts mit der Frage zu tun
Martin Smith