如何检查表是否存在以及它是否不存在在sql server 2008中创建表

Pra*_*ady 120 sql t-sql sql-server sql-server-2008-r2

__CODE__在sql server 2008中编写一个我需要检查__CODE__数据库中是否存在,如果没有,那么我需要创建它.

我该怎么做?

Phi*_*ley 147

相比之下,我喜欢使用object_id函数,如下所示.它更容易阅读,您不必担心sys.objects与sysobjects对sys.all_objects与sys.tables的关系.基本形式:

IF object_id('MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'
Run Code Online (Sandbox Code Playgroud)

当然,如果存在该名称的任何对象,这将显示为"存在" .如果您只想查看表格,则需要:

IF object_id('MyTable', 'U') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'
Run Code Online (Sandbox Code Playgroud)

它也适用于临时表:

IF object_id('tempdb.dbo.#MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'
Run Code Online (Sandbox Code Playgroud)

  • OBJECT_ID()参考:http://msdn.microsoft.com/en-us/library/ms190328.aspx (5认同)
  • 我经常看到使用的另一种方法(检查sys表)但这看起来很清晰易读.有没有理由不接受这种方法而不是接受的答案?(例如SQL迁移到不同数据库提供程序的兼容性问题,速度等)? (2认同)

SQL*_*ace 137

像这样的东西

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

BEGIN
CREATE TABLE [dbo].[YourTable](
    ....
    ....
    ....
) 

END
Run Code Online (Sandbox Code Playgroud)

  • 尊重地考虑使用索引字段而不是 _*_ 进行一些更改(为了执行计划)(object_id 是此表中通常引用的数字字段)使用 _type = 'U'_ 代替 (N' 中的 _type U') (列 _type_ 的类型为 _char_,使用 Nchar 会导致隐式转换,这通常会导致基数估计器出现问题)`if(不存在(从 sys.objects 中选择 object_id,其中 object_id = OBJECT_ID(N'[dbo].[ client_tgi_g67_period_list]') 和 type = 'U'))` (3认同)

Vah*_*ian 13

让我们通过以下脚本创建一个带有表的示例数据库:

CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
Run Code Online (Sandbox Code Playgroud)

方法1:使用INFORMATION_SCHEMA.TABLES视图

我们可以编写如下的查询来检查当前数据库中是否存在tblTest表.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
  PRINT 'Table Exists'
END
Run Code Online (Sandbox Code Playgroud)

上面的查询检查当前数据库中所有模式中是否存在tblTest表.如果要在指定的Schema和指定的数据库中检查Table的存在,那么我们可以编写上面的查询,而不是这样:

IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo'  AND TABLE_NAME = N'tblTest')
BEGIN
  PRINT 'Table Exists'
END
Run Code Online (Sandbox Code Playgroud)

此方法的优点:INFORMATION_SCHEMA视图可跨不同的RDBMS系统移植,因此移植到不同的RDBMS不需要任何更改.

方法2:使用OBJECT_ID()函数

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

IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END
Run Code Online (Sandbox Code Playgroud)

为表名指定数据库名称和模式名称部分是可选的.但是,指定数据库名称和模式名称提供了一个选项,用于检查指定数据库和指定模式中表的存在,而不是在所有模式中检入当前数据库.下面的查询显示,即使当前数据库是MASTER数据库,我们也可以检查数据库tblTestdbo模式中表的存在Test.

USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END
Run Code Online (Sandbox Code Playgroud)

优点:易于记忆.另一个值得注意的关于OBJECT_ID()函数的要点是:它提供了一个选项来检查在当前连接上下文中创建的临时表的存在.所有其他方法都检查是否存在跨所有连接上下文创建的临时表,而不仅仅是当前连接上下文.下面的查询显示了如何使用OBJECT_ID()函数检查临时表的存在:

CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
  PRINT 'Table Exists'
END
GO
Run Code Online (Sandbox Code Playgroud)

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

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

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
  PRINT 'Table Exists'
END
Run Code Online (Sandbox Code Playgroud)

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

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

IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'tblTest' AND Type = N'U')
BEGIN
  PRINT 'Table Exists'
END
Run Code Online (Sandbox Code Playgroud)

Sys.Tables目录视图从目录视图继承行Sys.Objects,Sys.objects目录视图称为基本视图,其中sys.Tables称为派生视图.Sys.Tables将仅为Table对象Sys.Object返回行,而除了返回表对象的行之外,它还返回对象的行,如:存储过程,视图等.

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

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

IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
  PRINT 'Table Exists'
END
Run Code Online (Sandbox Code Playgroud)

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


vel*_*ije 11

EDITED

您可以查看sys.tables以检查是否存在所需的表:

IF  NOT EXISTS (SELECT * FROM sys.tables
WHERE name = N'YourTable' AND type = 'U')

BEGIN
CREATE TABLE [SchemaName].[YourTable](
    ....
    ....
    ....
) 

END
Run Code Online (Sandbox Code Playgroud)