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

这里有两种可能的方法。哪一种是做这件事的标准/最佳方式?

第一个方法:

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%'; 

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


当前回答

您可以使用下面的代码

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

Or

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

其他回答

假设在一个数据库中有一个表t1。你想在其他数据库上运行脚本,比如-如果t1存在,那么什么都不做,创建t1。 要做到这个开放的视觉工作室,要做到以下几点:

右键单击t1,然后Script table as,然后DROP和Create To,然后新建查询编辑器

您将找到所需的查询。但是在执行该脚本之前,不要忘记注释掉查询中的drop语句,因为如果已经有一个drop语句,则您不想创建新的drop语句。

谢谢

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

信息模式视图定义在一个名为 INFORMATION_SCHEMA。这个模式包含在每个数据库中。

https://msdn.microsoft.com/en-us/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], 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年开始,微软通过添加if exists关键字来删除语句,简化了在删除之前检查不存在对象的功能。例如,

drop table if exists mytablename

将在一行代码中完成与OBJECT_ID / INFORMATION_SCHEMA包装器相同的事情。

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


-- -- create过程检查表是否存在


DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

-- --如何使用:检查表迁移是否存在


 CALL checkIfTableExists('muDbName', 'migrations', @output);

对于这样的查询,最好使用INFORMATION_SCHEMA视图。这些视图(大多数)是跨许多不同数据库的标准视图,很少在不同版本之间更改。

检查表是否存在:

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

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)