ChatGPT解决这个技术问题 Extra ChatGPT

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

表名是 Scores

执行以下操作是否正确?

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

M
Mauricio Gracia Gutierrez

执行以下操作是否正确? 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.#TempTableName', 'U') IS NOT NULL
  DROP TABLE #TempTableName; 

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


Fwiw - 第二个参数的 'U' 显然意味着“仅查找具有此名称的表对象”。 One source。所以 OBJECT_ID('TableName') 没有错误,但也不是非常精确,因此 'U' 在@Martin 的出色答案中。
关于第二个参数; here is another source ,我使用“V”作为视图。
嗨,你能解释一下这个第二个参数在 OBJECT_ID('tempdb.dbo.#T', 'U') 中的含义,例如这个 'U' 吗?
@ZvonimirTokic 它的意思是“用户定义的表”。 “IT”将是一个内部的、系统定义的表。完整列表在这里msdn.microsoft.com/en-us/library/ms190324.aspx
啊,我的“一个来源”消失了。 Archived here &谢谢@TheRedPea 提供第二个更规范的来源。
C
Callum Watkins

从 SQL Server 2016,您可以使用

DROP TABLE IF EXISTS dbo.Scores

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

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


那是完美的解决方案。我很感激。
如果在流行语中存在,我在使用 drop table 时遇到了非常奇怪的行为,它会引发错误。
j
jveazey

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)


if exists ansi 是否兼容?
如果数据库中有多个模式,请小心。您可能需要具体说明您正在检测和删除哪些 [Scores]。例如 WHERE TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo'
@kiquenet 通常是的,但在使用 if exists 时不会 - 因为它一旦返回一行就会停止。但无论如何,我个人总是选择 1。
B
Biondo86

见过太多没用的。创建临时表时,必须将其从 tempdb 中删除!

唯一有效的代码是:

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

谢谢,将 dbo 更改为 tempdb 使这项工作正常进行。我还想建议添加已接受答案评论中提到的 'u' 。因此,完整的 IF 语句如下所示:IF OBJECT_ID('tempdb..#temp', 'U')
T
Tomáš Fejfar

在 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


到目前为止,这是最清楚的解释。谢谢你。
s
sventevit

或者:

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

您可以使用 2005 年以来的 sys.tables 来简化此操作:if exists (select * from sys.tables where name = 'Scores') drop table Scores
A
Alex Chashin

有一种更简单的方法

DROP TABLE IF EXISTS table_name;

请记住,这是针对 SQL Server 2016 及更高版本的
这个答案已经在 5 年前给出stackoverflow.com/a/33497857/73226
h
hunch_hunch

我希望这有帮助:

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

P
Palec

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

同名但不同的架构呢?最好的方法在这里:stackoverflow.com/a/33497857/956364
P
Pang

很简单:

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

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


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

3
3N1GM4

我用:

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

R
RF1991

SQL Server 2016 及更高版本最好和最简单的是 DROP TABLE IF EXISTS [TABLE NAME]

前任:

DROP TABLE IF EXISTS dbo.Scores

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

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

这对现有答案没有任何新意
h
hmofrad

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

drop table if exists tableName cascade;

这不是有效的 SQL Server 语法
而且我相信(Microsoft)SQL Server 并不是唯一的 SQL 数据库。仅供参考,Vertica,Oracle,Snowflake 和 PostgreSQL;都支持 CASCADE 选项。因此,我的回答补充了您的回答,您不必因此而对我投反对票。
问题标记为 SQL Server
E
Erick de Vathaire

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

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

执行中:

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

J
Joseph Wambura

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

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

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

https://i.stack.imgur.com/crsin.png

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

https://i.stack.imgur.com/42ASB.png

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


此问题与 SQL 有关,与 Visual Studio 无关。因此,这个答案与这个问题无关。
顺便说一句,问题是“如果表存在,如何删除它?”带有标签“sql-server”,而没有专门将其添加到 SQL,因此这个答案不仅在技术上是正确的,而且一些(只知道基础知识)可能会发现这更方便和有用。