Comment supprimer une table si elle existe?

721

Le nom de la table est Scores.

Est-il correct de faire ce qui suit?

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

Réponses:

1377

Est-il correct de faire ce qui suit?

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

Non. Cela supprimera la table uniquement si elle contient des lignes (et générera une erreur si la table n'existe pas).

Au lieu de cela, pour une table permanente, vous pouvez utiliser

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

Ou, pour une table temporaire, vous pouvez utiliser

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

SQL Server 2016+ a une meilleure façon d'utiliser DROP TABLE IF EXISTS …. Voir la réponse de @Jovan .

Martin Smith
la source
137
Fwiw - Le 'U'second paramètre signifie apparemment " Rechercher uniquement les objets de ce nom qui sont des tables". Une seule source . Ce OBJECT_ID('TableName')n'est donc pas faux , mais ce n'est pas incroyablement précis non plus, donc 'U'dans l'excellente réponse de @ Martin.
ruffin
7
Concernant le deuxième param; voici une autre source , j'ai utilisé 'V' pour une vue.
The Red Pea
4
HI pouvez-vous m'expliquer ce que ce deuxième paramètre signifie dans OBJECT_ID ('tempdb.dbo. # T', 'U'), par exemple ce 'U'?
Zvonimir Tokic
9
@ZvonimirTokic signifie "Table définie par l'utilisateur". "IT" serait une table interne définie par le système. Une liste complète est ici msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith
151

La méthode ANSI SQL / multiplateforme consiste à utiliser INFORMATION_SCHEMA , qui a été spécialement conçu pour interroger les métadonnées sur les objets dans les bases de données SQL.

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

La plupart des serveurs SGBDR modernes offrent au moins une prise en charge de base de INFORMATION_SCHEMA, notamment: MySQL , Postgres , Oracle , IBM DB2 et Microsoft SQL Server 7.0 (et versions ultérieures) .

jveazey
la source
L' if existsansi est-il conforme?
Martin Smith
8
Soyez prudent si vous avez plusieurs schémas dans la base de données. Vous devrez peut-être préciser les [Scores] que vous détectez et supprimez. Par exemple, WHERE TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo'
Andrew Jens
@kiquenet Généralement oui, mais pas lors de l'utilisation de if existe - car cela s'arrête dès qu'il renvoie une ligne. Mais personnellement, je sélectionne toujours 1 de toute façon.
Harag
68

J'en ai vu tellement qui ne fonctionnent pas vraiment. lorsqu'une table temporaire est créée, elle doit être supprimée de tempdb!

Le seul code qui fonctionne est:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"
Biondo86
la source
3
Merci d'avoir changé dbopour tempdbfaire ce travail. Je voudrais également suggérer d'ajouter le 'u'comme mentionné dans les commentaires de la réponse acceptée. Ainsi, la déclaration IF complète ressemblerait à ceci:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz
38

Dans SQL Server 2016 (13.x) et supérieur

DROP TABLE IF EXISTS dbo.Scores

Dans les versions antérieures

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

U est tontable type

Farhan Yaseen
la source
28

Ou:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores
sventevit
la source
4
Vous pouvez utiliser sys.tables depuis 2005 pour simplifier cela:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker
26

J'espère que ça aide:

begin try drop table #tempTable end try
begin catch end catch
Vlad
la source
22

J'ai écrit un petit UDF qui renvoie 1 si son argument est le nom d'une table existante, 0 sinon:

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

Pour supprimer la table Usersi elle existe, appelez-la ainsi:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Mansfield
la source
Qu'en est-il du même nom mais d'un schéma différent? La meilleure façon est ici: stackoverflow.com/a/33497857/956364
Protiguous
9

C'est simple:

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

dbo.TableNameest votre table souhaitée et «U» est typede votre table.

Arsman Ahmad
la source
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
la source
4

J'utilise:

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

Il existe un moyen plus simple

DROP TABLE IF EXISTS table_name;
Alexandre Oliveira
la source
-1

Un meilleur moyen visuel et facile, si vous utilisez Visual Studio, ouvrez simplement la barre de menus,

Affichage -> Explorateur d'objets SQL Server

il devrait s'ouvrir comme indiqué ici

entrez la description de l'image ici

Sélectionnez et cliquez avec le bouton droit sur le tableau que vous souhaitez supprimer, puis supprimez. Un tel écran devrait être affiché. Cliquez sur Mettre à jour la base de données pour confirmer.

entrez la description de l'image ici

Cette méthode est très sûre car elle vous donne la rétroaction et vous avertira de toute relation de la table supprimée avec d'autres tables.

Githithu Wambura
la source
5
Cette question est liée à SQL, non liée à Visual Studio. Par conséquent, cette réponse est sans rapport avec cette question.
Adnan Sharif
-8

Faites comme ça, c'est le moyen le plus simple.

qry sera votre propre requête, tout ce que vous voulez dans la liste de sélection.

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

exec (@qry)

select * from TempData 

drop table TempData
Rajan s
la source
4
Est-ce juste moi ou cela ressemble à une injection? Commentez s'il vous plaît.
g00dy
5
Cela n'a rien à voir avec la question
Martin Smith