Відповіді:
Чи правильно робити наступне?
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 .
З SQL Server 2016 ви можете використовувати
DROP TABLE IF EXISTS dbo.Scores
Довідка: DROP IF EXITS - нова річ у SQL Server 2016
Незабаром це буде в базі даних SQL Azure.
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
ансі?
Побачила стільки, що насправді не працює. коли створена таблиця темп, її потрібно видалити з tempdb!
Єдиний код, який працює:
IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL --Remove dbo here
DROP TABLE #tempdbname -- Remoeve "tempdb.dbo"
dbo
щоб tempdb
зробити цю роботу. Я також хотів би запропонувати додати те 'u'
, що було зазначено у коментарях прийнятої відповіді. Таким чином, повне твердження IF виглядатиме так:IF OBJECT_ID('tempdb..#temp', 'U')
У 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
Або:
if exists (select * from sys.objects where name = 'Scores' and type = 'u')
drop table Scores
if exists (select * from sys.tables where name = 'Scores') drop table Scores
Я написав трохи 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]
Просте те, що:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
де dbo.TableName
потрібна таблиця, а "U" - type
ваша table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
Я використовую:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
Є простіший спосіб
DROP TABLE IF EXISTS table_name;
Кращий візуальний і простий спосіб, якщо ви використовуєте Visual Studio, просто відкрийте з рядка меню,
Перегляд -> Провідник об'єктів SQL Server
вона повинна відкриватися, як показано тут
Виберіть та клацніть правою кнопкою миші таблицю, яку ви хочете видалити, а потім видаліть. Такий екран повинен бути відображений. Натисніть Оновити базу даних для підтвердження.
Цей спосіб дуже безпечний, оскільки він дає вам зворотній зв'язок і попереджає про будь-які зв’язки видаленої таблиці з іншими таблицями.
SQL
, не пов'язане з цим Visual Studio
. Тому ця відповідь не має значення для цього питання.
Зробити це так, це найпростіший спосіб.
qry
буде вашим власним запитом, що б ви не хотіли у списку вибору.
set @qry = ' select * into TempData from (' + @qry + ')Tmp '
exec (@qry)
select * from TempData
drop table TempData
'U'
другий парам, мабуть, означає "Шукайте лише предмети з такою назвою, які є таблицями". Одне джерело . Так щоOBJECT_ID('TableName')
не помиляється , але це також не шалено точно, таким чином,'U'
у відмінній відповіді @ Мартіна.