Answers:
执行以下操作是否正确?
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+有更好的方法DROP TABLE IF EXISTS …
。请参阅@Jovan的答案。
在SQL Server 2016中,您可以使用
DROP TABLE IF EXISTS dbo.Scores
参考:DROP IF EXISTS-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(及更高版本)。
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;
你是你的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
我编写了一个小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”是type
你的table
。
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
有一个更简单的方法
DROP TABLE IF EXISTS table_name;
这样做,这是最简单的方法。
qry
将是您自己的查询,无论您在选择列表中想要什么。
set @qry = ' select * into TempData from (' + @qry + ')Tmp '
exec (@qry)
select * from TempData
drop table TempData
'U'
第二个参数显然意味着“仅查找具有此名称的表对象”。 一个来源。所以,OBJECT_ID('TableName')
是不是错的,但它不是出奇的准确要么,从而'U'
在@马丁的出色答卷。