Как удалить таблицу, если она существует в SQL Server? - PullRequest
641 голосов
/ 25 октября 2011

Имя таблицы Scores.

Правильно ли делать следующее?

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

Ответы [ 13 ]

1242 голосов
/ 25 октября 2011

Правильно ли делать следующее?

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

Нет. Это приведет к удалению таблицы, только если она содержит какие-либо строки (и вызовет ошибку, если таблица не существует).

Вместо этого для постоянного стола вы можете использовать

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

Или для временной таблицы вы можете использовать

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

SQL Server 2016+ имеет лучший способ, используя DROP TABLE IF EXISTS …. См. ответ @ Jovan .

295 голосов
/ 03 ноября 2015

В SQL Server 2016 вы можете использовать

DROP TABLE IF EXISTS dbo.Scores

Ссылка: УДАЛИТЬ ЕСЛИ СУЩЕСТВУЕТ - новая вещь в SQL Server 2016

Это будет в базе данных SQL Azureв ближайшее время.

143 голосов
/ 12 января 2013

ANSI SQL / кроссплатформенный способ заключается в использовании INFORMATION_SCHEMA , который был специально разработан для запроса метаданных об объектах в базах данных SQL.

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

Большинство современных серверов RDBMSобеспечить, по крайней мере, базовую поддержку INFORMATION_SCHEMA, включая: MySQL , Postgres , Oracle , IBM DB2 и Microsoft SQLСервер 7.0 (и выше) .

59 голосов
/ 01 августа 2014

видел так много, что на самом деле не работает. когда временная таблица создана, она должна быть удалена из базы данных tempdb!

Единственный код, который работает:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"
24 голосов
/ 26 сентября 2014

Надеюсь, это поможет:

begin try drop table #tempTable end try
begin catch end catch
24 голосов
/ 25 октября 2011

Или:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores
19 голосов
/ 01 марта 2013

Я написал небольшой UDF, который возвращает 1, если его аргумент является именем существующей таблицы, в противном случае 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

Чтобы удалить таблицу User, если она существует, назовите ее так:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]
16 голосов
/ 08 ноября 2017

В SQL Server 2016 (13.x) и выше

DROP TABLE IF EXISTS dbo.Scores

В более ранних версиях

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

U является вашимtable type

7 голосов
/ 13 апреля 2017

Все просто:

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

, где dbo.TableName - ваш желаемый стол, а 'U' - type вашего table.

4 голосов
/ 31 марта 2017
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
    DROP TABLE Scores
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...