提问



表名是Scores


执行以下操作是否正确?


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

最佳参考



  执行以下操作是否正确?


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+上的任何人,我都会指出这个答案 - 这有更好的方法。

其它参考1


从SQL Server 2016,您可以使用


DROP TABLE IF EXISTS dbo.Scores


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


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

其它参考2


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


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(及更高版本)。[28] [29] [30] [[[31] [32]

其它参考3


见过这么多,真的不行。
创建临时表时,必须从tempdb中删除它!


唯一有效的代码是:


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

其它参考4


要么:


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

其它参考5


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

其它参考6


我希望这有帮助:


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

其它参考7


简单的是:


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


其中dbo.TableName是你想要的表格而U是你table type

其它参考8


DROP TABLE IF EXISTS dbo.Scores


要么


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


是你的table type

其它参考9


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

其它参考10


我用:


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

其它参考11


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


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


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

exec (@qry)

select * from TempData 

drop table TempData