Як опустити таблицю, якщо вона існує?


721

Назва таблиці - Scores.

Чи правильно робити наступне?

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

Відповіді:


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'у відмінній відповіді @ Мартіна.
ruffin

7
Щодо другого парамуму; ось ще одне джерело , я використовував "V" для перегляду.
The Red Pea

4
HI Ви можете мені пояснити, що означає цей другий параметр у OBJECT_ID ('tempdb.dbo. # T', 'U'), наприклад, це 'U'?
Zvonimir Tokic

9
@ZvonimirTokic це означає "Таблиця, визначена користувачем". "IT" - це внутрішня, визначена системою таблиця. Повний список тут
Martin Smith


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 (і більше) .


Чи відповідає if existsансі?
Мартін Сміт

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"

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

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]

Що про те саме ім'я, але різні схеми? Кращий спосіб тут: 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.



4

Я використовую:

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


-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
Це також не має нічого спільного з питанням
Мартін Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.