Ответы:
Правильно ли делать следующее?
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 EXISTS - новое в 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
Соответствует ли ANSI?
Видел так много, что на самом деле не работает. когда временная таблица создана, она должна быть удалена из базы данных 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'
в превосходном ответе @ Martin.