我希望这是关于如何使用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%'; 

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


当前回答


-- -- 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);

其他回答

使用信息模式是SQL标准的方式,所以支持它的所有数据库都应该使用它。请参见答案中的方法1。

还要注意,如果出于任何原因你需要检查临时表,你可以这样做:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO

我有一些问题,无论是从INFORMATIONAL_SCHEME和OBJECT_ID选择。我不知道是不是ODBC驱动程序的问题。来自SQL管理工作室的查询都没问题。

下面是解决方案:

SELECT COUNT(*) FROM <yourTableNameHere>

因此,如果查询失败,则数据库中可能没有这样的表(或者您没有对它的访问权限)。

检查是通过比较处理ODBC驱动程序的SQL执行器返回的值(在我的情况下为整数)来完成的。

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
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_apctofannavigator。