Come eliminare una tabella se esiste?


721

Il nome della tabella è Scores.

È corretto fare quanto segue?

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

Risposte:


1377

È corretto fare quanto segue?

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

No. Questo eliminerà la tabella solo se contiene delle righe (e genererà un errore se la tabella non esiste).

Invece, per una tabella permanente puoi usare

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

Oppure, per una tabella temporanea è possibile utilizzare

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

SQL Server 2016+ ha un modo migliore, usando DROP TABLE IF EXISTS …. Vedi la risposta di @Jovan .


137
Fwiw - Il 'U'secondo parametro apparentemente significa " Cerca solo oggetti con questo nome che siano tabelle". Una fonte . Quindi OBJECT_ID('TableName')non è sbagliato , ma non è neanche follemente preciso, quindi 'U'nella risposta eccellente di @ Martin.
ruffin,

7
Per quanto riguarda il secondo parametro; ecco un'altra fonte , ho usato 'V' per una vista.
Il pisello rosso

4
HI, puoi spiegarmi cosa significa questo secondo parametro in OBJECT_ID ('tempdb.dbo. # T', 'U'), ad esempio questa 'U'?
Zvonimir Tokic,

9
@ZvonimirTokic significa "Tabella definita dall'utente". "IT" sarebbe una tabella interna, definita dal sistema. Un elenco completo è qui msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith


151

Il metodo ANSI SQL / multipiattaforma consiste nell'utilizzare INFORMATION_SCHEMA , che è stato specificamente progettato per interrogare metadati su oggetti all'interno di database SQL.

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

La maggior parte dei server RDBMS moderni fornisce almeno il supporto di base INFORMATION_SCHEMA, tra cui: MySQL , Postgres , Oracle , IBM DB2 e Microsoft SQL Server 7.0 (e versioni successive) .


L' if existsANSI è conforme?
Martin Smith,

8
Fai attenzione se hai più di uno schema nel database. Potresti dover essere specifico su quali [punteggi] stai rilevando ed eliminando. Ad esempio WHERE TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo'
Andrew Jens

@kiquenet Generalmente sì, ma non quando si utilizza if se - poiché questo si interrompe non appena restituisce una riga. Ma personalmente seleziono sempre 1 comunque.
Harag,

68

Ne ho visti così tanti che non funzionano davvero. quando viene creata una tabella temporanea, questa deve essere eliminata dal tempdb!

L'unico codice che funziona è:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"

3
Grazie, cambiando dboper tempdbrendere questo lavoro. Vorrei anche suggerire di aggiungere 'u'quanto indicato nei commenti della risposta accettata. Pertanto, l'intera dichiarazione IF sarebbe simile a questa:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz,

38

In SQL Server 2016 (13.x) e versioni successive

DROP TABLE IF EXISTS dbo.Scores

Nelle versioni precedenti

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

U è tuotable type


28

O:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores

4
È possibile utilizzare sys.tables dal 2005 per semplificare questo:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker,

26

Spero che questo possa essere d'aiuto:

begin try drop table #tempTable end try
begin catch end catch

22

Ho scritto un piccolo UDF che restituisce 1 se il suo argomento è il nome di una tabella esistente, 0 altrimenti:

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

Per eliminare la tabella Userse esiste, chiamala così:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]

Che dire dello stesso nome ma di uno schema diverso? Il modo migliore è qui: stackoverflow.com/a/33497857/956364
Protiguous

9

Semplice è che:

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

dov'è dbo.TableNameil tavolo desiderato e "U" è il typetuo table.


6
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
    DROP TABLE Scores
GO

4

Io uso:

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


-1

Un modo visivo e semplice migliore, se si utilizza Visual Studio, basta aprire dalla barra dei menu,

Visualizza -> Esplora oggetti di SQL Server

dovrebbe aprirsi come mostrato qui

inserisci qui la descrizione dell'immagine

Selezionare e fare clic con il pulsante destro del mouse sulla tabella che si desidera eliminare, quindi eliminare. Tale schermata dovrebbe essere visualizzata. Fare clic su Aggiorna database per confermare.

inserisci qui la descrizione dell'immagine

Questo metodo è molto sicuro in quanto ti dà il feedback e avviserà di eventuali relazioni della tabella eliminata con altre tabelle.


5
Questa domanda è correlata SQL, non correlata Visual Studio. Pertanto, questa risposta è irrilevante per questa domanda.
Adnan Sharif,

-8

Fai così, è il modo più semplice.

qry sarà la tua query, qualunque cosa tu voglia nell'elenco di selezione.

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

exec (@qry)

select * from TempData 

drop table TempData

4
Sono solo io o sembra incline all'iniezione? Per favore, commenta.
g00dy

5
Inoltre non ha nulla a che fare con la domanda
Martin Smith,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.