Как удалить таблицу, если она существует?

721

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

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

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores
tmaster
источник

Ответы:

1377

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

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 .

Мартин Смит
источник
137
Fwiw - 'U'для второго параметра очевидно означает «искать только объекты с этим именем, которые являются таблицами». Один источник . Так OBJECT_ID('TableName')что не ошибаюсь , но и не безумно точен, поэтому 'U'в превосходном ответе @ Martin.
Ерф
7
Что касается второго параметра; вот еще один источник , я использовал «V» для просмотра.
Красный горох
4
HI вы можете объяснить мне, что означает этот второй параметр в OBJECT_ID ('tempdb.dbo. # T', 'U'), например, это 'U'?
Звонимир Токич
9
@ZvonimirTokic означает «Таблица, определенная пользователем». «IT» будет внутренней, определенной системой, таблицей. Полный список находится здесь: msdn.microsoft.com/en-us/library/ms190324.aspx
Мартин Смит,
151

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 Server 7.0 (и выше) .

jveazey
источник
if existsСоответствует ли ANSI?
Мартин Смит
8
Будьте осторожны, если у вас есть более одной схемы в базе данных. Вам может потребоваться указать, какие [баллы] вы обнаруживаете и удаляете. Например, ГДЕ TABLE_NAME = 'Счета' И TABLE_SCHEMA = 'dbo'
Эндрю Дженс
@kiquenet Обычно да, но не при использовании оператора if, поскольку он останавливается, как только возвращается одна строка. Но я лично всегда выбираю 1 в любом случае.
Хараг
68

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

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

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"
Biondo86
источник
3
Спасибо, переходя dboна tempdbэту работу. Я также хотел бы предложить добавить, 'u'как указано в комментариях принятого ответа. Таким образом, полное утверждение IF будет выглядеть так:IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz
38

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

DROP TABLE IF EXISTS dbo.Scores

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

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

Ты твойtable type

Фархан Ясен
источник
28

Или:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores
sventevit
источник
4
Вы можете использовать sys.tables с 2005 года, чтобы упростить это:if exists (select * from sys.tables where name = 'Scores') drop table Scores
Майкл Паркер
26

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

begin try drop table #tempTable end try
begin catch end catch
влад
источник
22

Я написал небольшой 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]
Mansfield
источник
Как насчет того же имени, но другой схемы? Лучший способ здесь: stackoverflow.com/a/33497857/956364
Protiguous
9

Все просто:

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

где dbo.TableNameнаходится нужная таблица и «U» является typeиз ваших 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

Я использую:

if exists (select * 
           from sys.tables 
           where name = 'tableName' 
           and schema_id = schema_id('dbo'))
begin
    drop table dbo.tableName
end
user7463511
источник
3

Есть более простой способ

DROP TABLE IF EXISTS table_name;
Александр Оливейра
источник
-1

Лучший визуальный и простой способ, если вы используете Visual Studio, просто откройте в строке меню,

Вид -> Обозреватель объектов SQL Server

он должен открыться как показано здесь

введите описание изображения здесь

Выберите и щелкните правой кнопкой мыши таблицу, которую хотите удалить, затем удалите. Такой экран должен отображаться. Нажмите Обновить базу данных, чтобы подтвердить.

введите описание изображения здесь

Этот метод очень безопасен, так как дает обратную связь и предупреждает о любых отношениях удаленной таблицы с другими таблицами.

Гитхиту Вамбура
источник
5
Этот вопрос связан с SQL, не связан с Visual Studio. Поэтому этот ответ не имеет отношения к этому вопросу.
Аднан Шариф
-8

Делать так, это самый простой способ.

qry будет ваш собственный запрос, что вы хотите в списке выбора.

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

exec (@qry)

select * from TempData 

drop table TempData
Раджан с
источник
4
Это только у меня, или это похоже на укол? Прокомментируйте, пожалуйста.
g00dy
5
Это также не имеет ничего общего с вопросом
Мартин Смит