检查表在SQL Server中是否存在

时间:2020-03-06 15:05:00  来源:igfitidea点击:

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

陈述。我正在寻找类似的东西。

解决方案

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

只要我记得,我们总是使用OBJECT_ID样式

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

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

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

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

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

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

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

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