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

时间:2011-05-10 14:53:29

标签: sql sql-server tsql sql-server-2008-r2

我正在sql server 2008中编写Stored procedure 我需要检查数据库中是否存在table,否则我需要创建它。

我该怎么做?

8 个答案:

答案 0 :(得分:140)

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

IF object_id('MyTable') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

当然,如果任何带有该名称的对象,这将显示为“存在”。如果您只想检查表格,则需要:

IF object_id('MyTable', 'U') is not null
    PRINT 'Present!'
ELSE
    PRINT 'Not accounted for'

它也适用于临时表:

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

答案 1 :(得分: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

答案 2 :(得分:11)

EDITED

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

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

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

END

答案 3 :(得分:11)

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

CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))

方法1:使用INFORMATION_SCHEMA.TABLES视图

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

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

上述查询检查当前数据库中所有模式中是否存在tblTest表。如果您想检查指定Schema和Specified Database中Table的存在,那么我们可以编写上面的查询,如下所示:

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

此方法的优点: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

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

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

优点:易于记忆。关于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

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

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

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

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

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

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

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

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

答案 4 :(得分:3)

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE  TABLE_NAME = 'd020915'))
BEGIN
  declare @result int
  set @result=1
  select @result as result
END

答案 5 :(得分:1)

Declare @Username varchar(20)
Set @Username = 'Mike'

if not exists 
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')

Begin
    Create table tblEmp (ID int primary key, Name varchar(50))
    Print (@Username + ' Table created successfully')
End

Else

Begin
    Print (@Username + ' : this Table Already exists in the database')
End

答案 6 :(得分:0)

尝试使用以下语句检查数据库中是否存在表:

If not exists (select name from sysobjects where name = 'tablename')

您可以在if块中创建表。

答案 7 :(得分:-2)

如果我没错,这应该有效:

    if not exists (Select 1 from tableName)
create table ...