检查 SQL Server 中是否存在表

我希望这是关于如何使用 SQL 语句检查 SQL Server 2000/2005 中是否存在表的最终讨论。

当您用 Google 搜索答案时,会得到很多不同的答案。有官方 / 向后和向前兼容的方式吗?

这是两种可能的方法。两种方法中的哪一种是标准 / 最佳方法?

第一种方式:

IF EXISTS (SELECT 1 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

第二种方式:

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL提供的简单

SHOW TABLES LIKE '%tablename%';

声明。我正在寻找类似的东西。

答案

对于此类查询,最好始终使用INFORMATION_SCHEMA视图。这些视图(大多数情况下)是跨许多不同数据库的标准视图,并且很少因版本而异。

要检查表是否存在,请使用:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END

另请注意,如果出于任何原因需要检查临时表,可以执行以下操作:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists

只要我记得我们一直使用OBJECT_ID样式

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL

请查看以下方法,

方法 1:使用 INFORMATION_SCHEMA.TABLES 视图

我们可以编写如下查询,以检查当前数据库中是否存在客户表。

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

方法 2:使用 OBJECT_ID()函数

我们可以使用如下所示的 OBJECT_ID()函数来检查当前数据库中是否存在客户表。

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

方法 3:使用 sys.Objects 目录视图

我们可以使用 Sys.Objects 目录视图来检查表的存在,如下所示:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') 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'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

方法 5:避免使用 sys.sysobjects 系统表

我们应该避免直接使用 sys.sysobjects 系统表,在某些将来的 Sql Server 版本中将不建议直接使用它。根据 Microsoft BOL 链接,Microsoft 建议直接使用目录视图 sys.objects / sys.tables 而不是 sys.sysobjects 系统表。

IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' 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/

在其他数据库上查找表:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'

只是想提到一种情况,使用OBJECT_ID方法可能会更容易一些。 INFORMATION_SCHEMA视图是每个数据库下的对象 -

信息模式视图是在名为 INFORMATION_SCHEMA 的特殊模式中定义的。该模式包含在每个数据库中。

https://msdn.microsoft.com/zh-CN/library/ms186778.aspx

因此,您使用来访问的所有表

IF EXISTS (SELECT 1 
           FROM [database].INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

只会反映[database] 。如果要检查另一个数据库中的表是否存在,而又不每次都动态更改[database] ,则OBJECT_ID将允许您立即进行操作。前

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

效果和

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL SERVER 2016 编辑

从 2016 年开始,Microsoft 通过将if exists关键字添加到drop语句,简化了在删除之前检查不存在的对象的功能。例如,

drop table if exists mytablename

在 1 行代码中将执行与OBJECT_ID / INFORMATION_SCHEMA包装器相同的操作。

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

IF OBJECT_ID('mytablename') IS NOT NULL

使用信息架构是 SQL 标准的实现方式,因此,支持它的所有数据库都应使用它。

IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

在上面的代码中,表名称为Mapping_APCToFANavigator

如果您需要在其他数据库上工作:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END