检查表是否存在于SQL服务器中

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

这里有两种可能的方法。哪一种是标准的/最好的方法?

第一种方式:

IF EXISTS (SELECT 1FROM INFORMATION_SCHEMA.TABLESWHERE 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 NULLSELECT 1 AS res ELSE SELECT 0 AS res;

mysql提供简单

SHOW TABLES LIKE '%tablename%';

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

1672216 次浏览

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

我们总是使用OBJECT_ID风格,只要我记得

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

对于这样的查询,最好使用INFORMATION_SCHEMA视图。这些视图(大部分)是许多不同数据库的标准视图,很少因版本而异。

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

IF (EXISTS (SELECT *FROM INFORMATION_SCHEMA.TABLESWHERE TABLE_SCHEMA = 'TheSchema'AND  TABLE_NAME = 'TheTable'))BEGIN--Do StuffEND

如果您需要在不同的数据库上工作:

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.TABLESWHERE TABLE_CATALOG = @CatalogAND TABLE_SCHEMA = @SchemaAND TABLE_NAME = @Table))BEGIN--do stuffEND

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

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

我知道这是一个老问题,但如果你打算经常打电话给我,我发现了这种可能性。

create procedure Table_Exists@tbl varchar(50)asreturn (select count(*) from sysobjects where type = 'U' and name = @tbl)go
IF EXISTS(SELECT   *FROM     sys.objectsWHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]')ANDtype in (N'U'))BEGIN
-- Do whatever you need to here.
END

在上面的代码中,表名是Mapping_APCToFANavigator

在不同的数据库中查找表:

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

考虑在一个数据库中您有一个表t1。您想在其他数据库上运行脚本,例如-如果t1存在,则不执行其他操作创建t1。要做这个开放的视觉工作室并执行以下操作:

右键单击t1,然后将表脚本为,然后删除并创建到,然后单击新建查询编辑器

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

谢了

IF EXISTS(SELECT  *
FROM    INFORMATION_SCHEMA.TABLES
WHERE   TABLE_SCHEMA = 'PutSchemaHere'ANDTABLE_NAME   = 'PutTableNameHere')
IF OBJECT_ID('mytablename') IS NOT NULL

如果有人试图在linq to sql(或特别是linqpad)中做同样的事情,请打开选项以包含系统表和视图并执行以下代码:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )where oSchema !=nulllet o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):nullwhere o!=null

假设你有一个对象,它的名称在一个名为Item的属性中,而模式在一个名为Schema的属性中,其中源变量名为a

select name from SysObjects where xType='U' and name like '%xxx%' order by name

对于任何还没有找到解决方案的人来说,重要的是要知道:SQL服务器如果你想用MYSQL来做,这很简单

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";$result = mysql_query($sql);if( $result == false )echo "table DOES NOT EXIST";elseecho "table exists";

在这里发布这个,因为它是谷歌的热门话题。

如果这是“终极”讨论,那么应该注意的是,如果服务器是链接的,Larry Leonard的脚本也可以查询远程服务器。

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

你可以使用这个:

     IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULLBEGINprint 'deleted table';drop table tENDelsebeginprint 'table not found'end
Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)insert into t( name, lastname) values('john','doe');insert into t( name, lastname) values('rose',NULL);
Select * from t1   john    doe2   rose    NULL
-- cleandrop table t

请参阅以下方法,

方法1:使用INFORMATION_SCHEMA.TABLES视图

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

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

方法2:使用OBJECT_ID()函数

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

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

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

我们可以使用Sys. Object曲库视图来检查Table是否存在,如下所示:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')BEGINPRINT 'Table Exists'END

方法4:使用sys. Tables目录视图

我们可以使用Sys. Tables曲库视图来检查Table是否存在,如下所示:

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')BEGINPRINT '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')BEGINPRINT 'Table Exists'END

引用自:http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/

只是在这里添加,为了开发人员和其他DBA的利益

接收@Tablename作为参数的脚本

(可能包含也可能不包含模式名),如果schema.table存在,则返回以下信息:

the_name                object_id   the_schema  the_table       the_type[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

每次我需要测试表或视图是否存在时,我都会在其他脚本中使用这个脚本,当它存在时,让它的object_id用于其他目的。

当您传递空字符串、错误的模式名称或错误的表名称时,它会引发错误。

这可能在过程内部并返回-1。

例如,我在我的一个数据仓库数据库中有一个名为“Facts. FactBackOrder”的表。

我是这样实现的:

PRINT 'THE SERVER IS ' + @@SERVERNAME--select db_name()PRINT 'THE DATABASE IS ' + db_NAME()PRINT ''GO
SET NOCOUNT ONGO
--===================================================================================-- @TableName is the parameter-- the object we want to deal with (it might be an indexed view or a table)-- the schema might or might not be specified-- when not specified it is DBO--===================================================================================
DECLARE @TableName SYSNAME
SELECT @TableName = 'Facts.FactBackOrder'--===================================================================================--===================================================================================DECLARE @Schema SYSNAMEDECLARE @I INTDECLARE @Z INT
SELECT @TableName = LTRIM(RTRIM(@TableName))SELECT @Z = LEN(@TableName)
IF (@Z = 0) BEGIN
RAISERROR('Invalid @Tablename passed.',16,1)
END
SELECT @I = CHARINDEX('.',@TableName )--SELECT @TableName ,@I
IF @I > 0 BEGIN
--===================================================================================-- a schema and table name have been passed-- example Facts.FactBackOrder-- @Schema = Fact-- @TableName = FactBackOrder--===================================================================================
SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@Z-@I)


ENDELSE BEGIN
--===================================================================================-- just a table name have been passed-- so the schema will be dbo-- example Orders-- @Schema = dbo-- @TableName = Orders--===================================================================================
SELECT @Schema    = 'DBO'

END
--===================================================================================-- Check whether the @SchemaName is valid in the current database--===================================================================================
IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN
RAISERROR('Invalid Schema Name.',16,1)
END
--SELECT @Schema  as [@Schema]--      ,@TableName as [@TableName]

DECLARE @R1 TABLE (
THE_NAME SYSNAME,THE_SCHEMA SYSNAME,THE_TABLE SYSNAME,OBJECT_ID INT,THE_TYPE SYSNAME,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)
)
;WITH RADHE_01 AS (SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name],the_schema=SCHEMA_NAME(O.schema_id),the_table=O.NAME,object_id =o.object_id,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' ENDfrom sys.objects Owhere O.is_ms_shipped = 0AND O.TYPE IN ('U','V'))INSERT INTO @R1 (THE_NAME,THE_SCHEMA,THE_TABLE,OBJECT_ID,THE_TYPE)SELECT  the_name,the_schema,the_table,object_id,the_typeFROM RADHE_01WHERE the_schema = @SchemaAND the_table  = @TableName
IF (@@ROWCOUNT = 0) BEGIN
RAISERROR('Invalid Table Name.',16,1)
ENDELSE BEGIN
SELECT     THE_NAME,THE_SCHEMA,THE_TABLE,OBJECT_ID,THE_TYPE
FROM @R1
END

SQLServer 2000中,您可以尝试:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')BEGINSELECT 1 AS 'res'END

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

信息模式视图在名为INFORMATION_SCHEMA此模式包含在每个数据库中。

https://msdn.microsoft.com/en-us/library/ms186778.aspx

因此,您使用的所有表

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

将仅反映[database]中的内容。如果您想检查另一个数据库中的表是否存在,而无需每次动态更改[database]OBJECT_ID将让您开箱即用。ex-

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

效果一样好

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

SQL服务器2016 Edit

从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/


----创建过程来检查表是否存在


DELIMITER $$
DROP PROCEDURE IF EXISTS `checkIfTableExists`;
CREATE PROCEDURE checkIfTableExists(IN databaseName CHAR(255),IN tableName CHAR(255),OUT boolExistsOrNot CHAR(40))
BEGINSELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLESWHERE (TABLE_SCHEMA = databaseName)AND (TABLE_NAME = tableName);END $$
DELIMITER ;

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


 CALL checkIfTableExists('muDbName', 'migrations', @output);
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )BEGINSELECT * FROM dbo.TableName;ENDGO

我在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(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULLPRINT 'Table Exists';
IF EXISTS (SELECT *FROM INFORMATION_SCHEMA.TABLESWHERETABLE_CATALOG = 'Database Name' andTABLE_NAME = 'Table Name' andTABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted
BEGIN--TABLE EXISTSEND
ELSE BEGIN--TABLE DOES NOT EXISTSEND

您可以使用下面的代码

IF (OBJECT_ID('TableName') IS NOT NULL )BEGINPRINT 'Table Exists'ENDELSEBEGINPRINT 'Table NOT Exists'END

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

我在这里创建视图作为示例

因为ALTER/CREATE命令不能在BEGIN/END块中。您需要测试是否存在并在创建之前删除它

IF Object_ID('TestView') IS NOT NULLDROP VIEW TestView
GO
CREATE VIEW TestViewas. . .
GO

如果您担心权限丢失,您也可以编写GRANT语句的脚本,并在最后重新运行这些语句。

您可以将创建/更改包装成字符串并执行EXEC-对于大型视图来说可能会变得丑陋

DECLARE @SQL as varchar(4000)
-- set to body of viewSET @SQL = 'SELECT X, Y, Z FROM TABLE'
IF Object_ID('TestView') IS NULLSET @SQL = 'CREATE VIEW TestView AS ' + @SQLELSESET @SQL = 'ALTER VIEW TestView AS ' + @SQL

还有一个选项可以检查表是否跨数据库存在

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')BEGIN-- do whatever you wantEND

我认为以下查询有效:

IF EXISTS (select * from sys.tablesWHERE name='mytablename' )BEGINprint 'table exists in the database'END