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

How to drop a table if it exists in SQL Server?

表名是Scores

执行以下操作是否正确?

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

Is it correct to do the following?

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

不会。只有在包含任何行时才会删除表(如果表不存在则会引发错误)。

相反,对于永久表,您可以使用

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

或者,对于临时表,您可以使用

1
2
IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T;

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


从SQL Server 2016,您可以使用

1
DROP TABLE IF EXISTS dbo.Scores

参考:DROP IF EXISTS - SQL Server 2016中的新功能

它将很快出现在SQL Azure数据库中。


ANSI SQL /跨平台方式是使用INFORMATION_SCHEMA,它专门用于查询有关SQL数据库中对象的元数据。

1
2
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(及更高版本)。


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

唯一有效的代码是:

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


我希望这有帮助:

1
2
BEGIN try DROP TABLE #tempTable END try
BEGIN catch END catch


要么:

1
2
IF EXISTS (SELECT * FROM sys.objects WHERE name = 'Scores' AND TYPE = 'u')
    DROP TABLE Scores


我写了一个小UDF,如果它的参数是现存表的名称,则返回1,否则返回0:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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(如果存在),请像这样调用它:

1
IF [dbo].[Table_exists]('User') = 1 DROP TABLE [USER]


在SQL Server 2016(13.x)及更高版本中

1
DROP TABLE IF EXISTS dbo.Scores

在早期版本中

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

你是你的table type


简单的是:

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

其中dbo.TableName是您想要的表格,而'U'是tabletype


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

我用:

1
2
3
4
5
6
7
IF EXISTS (SELECT *
           FROM sys.tables
           WHERE name = 'tableName'
           AND schema_id = schema_id('dbo'))
BEGIN
    DROP TABLE dbo.tableName
END


一个更好的视觉和简单方法,如果您使用Visual Studio,只需从菜单栏打开,

View -> SQL Server Object Explorer

它应该如此处所示打开

enter image description here

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

enter image description here

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


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

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

1
2
3
4
5
6
7
SET @qry = ' select * into TempData from (' + @qry + ')Tmp  '

EXEC (@qry)

SELECT * FROM TempData

DROP TABLE TempData