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

tma*_*ter 678 t-sql sql-server

表名是Scores.

执行以下操作是否正确?

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 1303

执行以下操作是否正确?

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores
Run Code Online (Sandbox Code Playgroud)

这将删除该表仅当它包含任何行(如果该表不存在会引发错误).

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

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL 
  DROP TABLE dbo.Scores; 
Run Code Online (Sandbox Code Playgroud)

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

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 
Run Code Online (Sandbox Code Playgroud)

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

  • Fwiw - 第二个参数的"U"显然意味着"只查找具有此表名称的对象".[一个来源](http://beyondrelational.com/modules/2/blogs/28/posts/10487/using-tsql-function-objectid.aspx).因此`OBJECT_ID('TableName')`不是*错误的*,但它也不是非常精确,因此在@Martin的优秀答案中是''U'. (132认同)
  • @ZvonimirTokic表示"用户定义表"."IT"将是一个内部的系统定义表.完整列表在这里https://msdn.microsoft.com/en-us/library/ms190324.aspx (9认同)
  • 关于第二个参数; [这是另一个来源](http://msdn.microsoft.com/en-us/library/ms190324.aspx),我用'V'作为视图. (7认同)
  • 你能解释一下第二个参数在OBJECT_ID('tempdb.dbo.#T','U')中的含义,例如这个'U'? (4认同)
  • 唉,我的“唯一来源”消失了。[存档在这里](https://web.archive.org/web/20120321203046/http://beyondrelational.com/modules/2/blogs/28/posts/10487/using-tsql-function-objectid.aspx) &谢谢@TheRedPea 提供的第二个更规范的来源。 (2认同)

Jov*_*SFT 319

从SQL Server 2016,您可以使用

DROP TABLE IF EXISTS dbo.Scores
Run Code Online (Sandbox Code Playgroud)

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

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

  • 当我发现它存在时,我立即冲出去使用它,但它似乎仍然对查询计划造成严重破坏,在 SQL Server 2019 中仍然如此。当我从“IF OBJECT_ID() IS NOT NULL DROP TABLE #T_Foo”切换到到 `DROP TABLE IF EXISTS #T_Foo`,否则相同的存储过程从 10 毫秒更改为 25 秒!因此,如果您使用这种新语法,请务必衡量性能。 (2认同)

jve*_*zey 147

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

if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
    drop table dbo.Scores;
Run Code Online (Sandbox Code Playgroud)

大多数现代RDBMS服务器至少提供基本的INFORMATION_SCHEMA支持,包括:MySQL,Postgres,Oracle,IBM DB2Microsoft SQL Server 7.0(及更高版本).

  • 如果数据库中有多个模式,请务必小心.您可能需要具体说明您正在检测和删除的[分数].例如,WHERE TABLE_NAME ='得分'和TABLE_SCHEMA ='dbo' (6认同)
  • “如果存在”是否符合 ansi 要求? (2认同)

Bio*_*o86 60

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

唯一有效的代码是:

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

  • 谢谢,将`dbo`改为`tempdb`使这项工作成功.我还建议在接受的答案的评论中添加"u".因此,完整的IF语句将如下所示:`IF OBJECT_ID('tempdb ..#temp','U')` (3认同)

sve*_*vit 27

要么:

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

  • 你可以使用自2005年以来的sys.tables来简化这个:`if exists(select*from sys.tables where name ='Scores')drop table Scores` (4认同)

小智 27

有一个更简单的方法

DROP TABLE IF EXISTS table_name;
Run Code Online (Sandbox Code Playgroud)

  • 请记住,这是针对 SQL Server 2016 及更高版本的 (3认同)

小智 26

我希望这有帮助:

begin try drop table #tempTable end try
begin catch end catch
Run Code Online (Sandbox Code Playgroud)


Far*_*een 26

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

DROP TABLE IF EXISTS dbo.Scores
Run Code Online (Sandbox Code Playgroud)

在早期版本中

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL 
DROP TABLE dbo.Scores; 
Run Code Online (Sandbox Code Playgroud)

是你的table type

  • 到目前为止,这是最清楚的解释了。谢谢。 (2认同)

Man*_*eld 20

我写了一个小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
Run Code Online (Sandbox Code Playgroud)

要删除表,User如果它存在,请调用它:

IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Run Code Online (Sandbox Code Playgroud)


Ars*_*mad 9

简单的是:

IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
Run Code Online (Sandbox Code Playgroud)

dbo.TableName你想要的桌子在哪里,'U'type你的table.


小智 7

SQL Server 2016及以上版本最好、最简单的一个是 DROP TABLE IF EXISTS [TABLE NAME]

前任:

DROP TABLE IF EXISTS dbo.Scores
Run Code Online (Sandbox Code Playgroud)

如果假设上面的方法不起作用,那么您可以使用下面的方法

IF OBJECT_ID('dbo.Scores', 'u') IS NOT NULL 
DROP TABLE dbo.Scores;
Run Code Online (Sandbox Code Playgroud)

  • 这对现有答案没有增加任何新内容 (2认同)

Alf*_*med 6

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