让我们通过以下脚本创建一个带有表的示例数据库:
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
方法 1:使用 INFORMATION_SCHEMA.TABLES 视图
我们可以编写如下查询来检查当前数据库中是否存在 tblTest 表。
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
上述查询检查当前数据库中所有模式的 tblTest 表是否存在。如果您想检查指定 Schema 和指定数据库中的表是否存在,那么我们可以编写上述查询,如下所示:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
这种方法的优点:INFORMATION_SCHEMA 视图可以跨不同的 RDBMS 系统移植,因此移植到不同的 RDBMS 不需要任何更改。
方法二:使用 OBJECT_ID() 函数
我们可以使用下面的OBJECT_ID()函数来检查当前数据库中是否存在tblTest表。
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
为表名称指定数据库名称和架构名称部分是可选的。但是指定数据库名称和模式名称提供了一个选项来检查指定数据库和指定模式中的表是否存在,而不是在所有模式中检查当前数据库。下面的查询表明,即使当前数据库是 MASTER 数据库,我们也可以在Test 数据库中检查dbo 架构中的tblTest 表是否存在。
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
优点:容易记住。关于OBJECT_ID() 函数的另一个值得注意的点是:它提供了一个选项来检查在当前连接上下文中创建的临时表是否存在。所有其他方法检查是否存在跨所有连接上下文创建的临时表,而不仅仅是当前连接上下文。下面的查询显示了如何使用OBJECT_ID() 函数检查临时表是否存在:
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
方法 3:使用 sys.Objects 目录视图
我们可以使用Sys.Objects目录视图来检查Table是否存在,如下图:
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
方法 4:使用 sys.Tables 目录视图
我们可以使用Sys.Tables目录视图来检查Table是否存在,如下图:
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables 目录视图从Sys.Objects 目录视图继承行,Sys.objects 目录视图称为基础视图,而sys.Tables 称为派生视图。 Sys.Tables 将只返回 Table 对象的行,而 Sys.Object view 除了返回 table 对象的行外,它还返回对象的行,例如:存储过程、视图等。
方法五:避免使用 sys.sysobjects 系统表
我们应该避免直接使用sys.sysobjects 系统表,在未来的某些Sql Server 版本中将不推荐直接访问它。根据 [Microsoft BOL][1] 链接,Microsoft 建议直接使用目录视图 sys.objects/sys.tables 而不是 sys.sysobjects 系统表。
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
参考:http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/