表名是 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.#TempTableName', 'U') IS NOT NULL
DROP TABLE #TempTableName;
SQL Server 2016+ 有更好的方法,使用 DROP TABLE IF EXISTS …
。请参阅the answer by @Jovan。
从 SQL Server 2016,您可以使用
DROP TABLE IF EXISTS dbo.Scores
参考:DROP IF EXISTS - new thing in SQL Server 2016
它将很快出现在 SQL Azure 数据库中。
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 支持,包括:MySQL、Postgres、Oracle、IBM DB2 和 Microsoft SQL Server 7.0 (and greater)。
if exists
ansi 是否兼容?
见过太多没用的。创建临时表时,必须将其从 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')
在 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
或者:
if exists (select * from sys.objects where name = 'Scores' and type = 'u')
drop table Scores
if exists (select * from sys.tables where name = 'Scores') drop table Scores
有一种更简单的方法
DROP TABLE IF EXISTS table_name;
我希望这有帮助:
begin try drop table #tempTable end try
begin catch end catch
我写了一个小 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]
很简单:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
其中 dbo.TableName
是您想要的表格,'U' 是您的 table
的 type
。
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
我用:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
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;
确保在最后使用 cascade
约束来自动删除依赖于表的所有对象(例如视图和投影)。
drop table if exists tableName cascade;
如果您使用长代码并且想为临时表编写更少的代码,请创建此过程:
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) ....
更好的视觉和简单的方法,如果您使用的是 Visual Studio,只需从菜单栏打开,
查看 -> SQL Server 对象资源管理器
它应该像这里显示的那样打开
https://i.stack.imgur.com/crsin.png
选择并右键单击要删除的表,然后删除。应该显示这样的屏幕。单击更新数据库进行确认。
https://i.stack.imgur.com/42ASB.png
这种方法非常安全,因为它可以为您提供反馈,并会警告已删除表与其他表的任何关系。
SQL
有关,与 Visual Studio
无关。因此,这个答案与这个问题无关。
'U'
显然意味着“仅查找具有此名称的表对象”。 One source。所以OBJECT_ID('TableName')
没有错误,但也不是非常精确,因此'U'
在@Martin 的出色答案中。