Antworten:
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 .
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.
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) .
if exists
Ansi-konform?
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"
dbo
um tempdb
diese 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')
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
Oder:
if exists (select * from sys.objects where name = 'Scores' and type = 'u')
drop table Scores
if exists (select * from sys.tables where name = 'Scores') drop table Scores
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]
Einfach ist das:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
wo die dbo.TableName
gewünschte Tabelle ist und ‚U‘ ist type
Ihre table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
Ich benutze:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
Es gibt einen einfacheren Weg
DROP TABLE IF EXISTS table_name;
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
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.
Diese Methode ist sehr sicher, da sie Ihnen Feedback gibt und Sie vor Beziehungen der gelöschten Tabelle zu anderen Tabellen warnt.
SQL
, nicht auf Visual Studio
. Daher ist diese Antwort für diese Frage irrelevant.
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
'U'
für den zweiten Parameter bedeutet anscheinend "Nur nach Objekten mit diesem Namen suchen, die Tabellen sind". Eine Quelle . AlsoOBJECT_ID('TableName')
ist es nicht falsch , aber es ist auch nicht wahnsinnig präzise, also'U'
in @ Martins ausgezeichneter Antwort.