如何删除一个表,如果它存在?

表名称为Scores

做到以下几点是正确的吗?

IF EXISTS(SELECT *FROM   dbo.Scores)DROP TABLE dbo.Scores
1530025 次浏览

做到以下几点是正确的吗?

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

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

相反,对于一个永久性的表,你可以使用

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULLDROP TABLE dbo.Scores;

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

IF OBJECT_ID('tempdb.dbo.#TempTableName', 'U') IS NOT NULLDROP TABLE #TempTableName;

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

或:

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

ANSISQL /cross-platform方法是使用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支持,包括:mysqlPostgresOracleIBMDB2MicrosoftSQLServer 7.0(及更高版本)

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

CREATE FUNCTION [dbo].[Table_exists](@TableName VARCHAR(200))RETURNS BITASBEGINIf 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('tempdb..#tempdbname') IS NOT NULL     --Remove dbo hereDROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"

我希望这有助于:

begin try drop table #tempTable end trybegin catch end catch

从SQLServer 2016您可以使用

DROP TABLE IF EXISTS dbo.Scores

参考:DROP IF EXISTS-SQLServer 2016中的新事物

它将很快SQLAzure数据库中。

我使用:

if exists (select *from sys.tableswhere name = 'tableName'and schema_id = schema_id('dbo'))begindrop table dbo.tableNameend
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))DROP TABLE ScoresGO

简单的是:

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

其中dbo.TableName是您想要的表,我们table中的type

在SQLServer 2016(13. x)及以上

DROP TABLE IF EXISTS dbo.Scores

在早期版本

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULLDROP TABLE dbo.Scores;

U是你的table type

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

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

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

在此处输入图片描述

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

在此处输入图片描述

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

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

drop table if exists tableName cascade;

SQLServer 2016及以上最好的和简单的一个是如果存在,则删除表[表名]

例如:

DROP TABLE IF EXISTS dbo.Scores

如果假设上面的一个不起作用,那么你可以使用下面的一个

IF OBJECT_ID('dbo.Scores', 'u') IS NOT NULLDROP TABLE dbo.Scores;

如果您使用长代码并希望为临时表编写更少的代码,请创建此过程:

CREATE PROCEDURE MF_DROP (@TEMP AS VARCHAR(100)) ASEXEC('IF OBJECT_ID(''TEMPDB.DBO.' + @TEMP + ''', ''U'') IS NOT NULL DROP TABLE ' + @TEMP)

执行中:

EXEC MF_DROP #ACREATE TABLE #A (I INT) ....