web-dev-qa-db-fra.com

Comment supprimer une table si elle existe dans SQL Server?

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 
651
tmaster

Est-il correct de faire ce qui suit?

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

Non. Cela supprimera le tableau uniquement s'il contient des lignes (et générera une erreur si le tableau n'existe pas).

À la place, vous pouvez utiliser pour une table permanente

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+ offre un meilleur moyen d'utiliser DROP TABLE IF EXISTS …. Voir la réponse de @Jovan .

1262
Martin Smith

À partir de SQL Server 2016, vous pouvez utiliser

DROP TABLE IF EXISTS dbo.Scores

Référence: DROP IF EXISTS - nouveauté de SQL Server 2016

Ce sera bientôt dans la base de données SQL Azure.

302
Jovan MSFT

La méthode ANSI SQL/multiplateforme consiste à utiliser INFORMATION_SCHEMA , spécialement conçu pour interroger des métadonnées sur des objets dans des 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 de SGBDR modernes fournissent au moins le support de base de INFORMATION_SCHEMA, notamment: MySQL , Postgres , Oracle , IBM DB2 =, et Microsoft SQL Server 7.0 (et supérieur) .

144
jveazey

J'ai vu tellement de gens qui ne fonctionnent pas vraiment. quand une table temporaire est créée, elle doit être supprimée de la base de données tempdb!

Le seul code qui fonctionne est:

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

J'espère que ça aide:

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

Ou:

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

J'ai écrit un petit UDF qui retourne 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 User si elle existe, appelez-la comme suit:

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

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 votre table type

18
Farhan Yaseen

Simple est que:

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

dbo.TableName est votre table souhaitée et 'U' est type de votre table.

7
Arsman Ahmad
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
    DROP TABLE Scores
GO
4
Alfaiz Ahmed

J'utilise:

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