如果SQL Server中存在表,如何删除表?

时间:2011-10-25 09:05:47

标签: sql sql-server

表格名称为Scores

执行以下操作是否正确?

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

16 个答案:

答案 0 :(得分:1223)

  

执行以下操作是否正确?

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; 

使用DROP TABLE IF EXISTS …,SQL Server 2016+有更好的方法。请参阅the answer by @Jovan

答案 1 :(得分:286)

从SQL Server 2016开始,您可以使用

DROP TABLE IF EXISTS dbo.Scores

参考:DROP IF EXISTS - new thing in SQL Server 2016

很快就会出现在SQL Azure数据库中。

答案 2 :(得分:142)

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支持,包括:MySQLPostgresOracleIBM DB2Microsoft SQL Server 7.0 (and greater)。< / p>

答案 3 :(得分:57)

看过很多不能正常工作的人。 创建临时表时,必须从tempdb中删除它!

唯一有效的代码是:

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"

答案 4 :(得分:24)

或者:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores

答案 5 :(得分:23)

我希望这会有所帮助:

begin try drop table #tempTable end try
begin catch end catch

答案 6 :(得分:19)

有一种更简单的方法

DROP TABLE IF EXISTS table_name;

答案 7 :(得分:18)

我写了一个小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]

答案 8 :(得分:14)

在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

答案 9 :(得分:6)

简单就是:

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

其中dbo.TableName是您所需的表格,而'U'type table

答案 10 :(得分:3)

IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
    DROP TABLE Scores
GO

答案 11 :(得分:2)

我用:

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

答案 12 :(得分:0)

确保在最后使用 cascade 约束来自动删除依赖于表的所有对象(例如视图和投影)。

drop table if exists tableName cascade;

答案 13 :(得分:0)

SQL Server 2016 及以上最好最简单的就是 DROP TABLE IF EXISTS [TABLE NAME]

例如: 如果存在 dbo.Scores,则删除表

如果上面的一个不起作用,那么你可以使用下面的一个 如果 OBJECT_ID('dbo.Scores', 'u') 不是 NULL 删除表 dbo.Scores;

答案 14 :(得分:-2)

如果您使用的是Visual Studio,则可以通过菜单栏中的一个更好的直观便捷的方式

  

查看-> SQL Server对象资源管理器

它应该像这里显示的那样打开

enter image description here

选择并右键单击要删除的表,然后删除。应该显示这样的屏幕。单击更新数据库以确认。

enter image description here

此方法非常安全,因为它可以为您提供反馈,并会警告已删除表与其他表的任何关系。

答案 15 :(得分:-8)

这样做,这是最简单的方法。

qry将是您自己的查询,无论您在选择列表中想要什么。

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

exec (@qry)

select * from TempData 

drop table TempData