检查表是否存在,如果不存在则在SQL Server 2008中创建它

问题描述 投票:0回答:9

我正在 SQL Server 2008 中编写一个存储过程。 我需要检查数据库中是否存在表。如果没有,那么我需要创建它。

我该怎么做?

sql sql-server t-sql sql-server-2008-r2
9个回答
174
投票

类似这样的事情

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

169
投票

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

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

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

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'

28
投票

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

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 表。如果您想检查指定架构和指定数据库中的表是否存在,那么我们可以编写上面的查询,如下所示:

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

为表名称指定数据库名称和架构名称部分是可选的。但是指定数据库名称和架构名称提供了一个选项来检查指定数据库和指定架构内的表是否存在,而不是跨所有架构检查当前数据库。下面的查询显示,即使当前数据库是 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
目录视图来检查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

方法 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

Sys.Tables
目录视图继承
Sys.Objects
目录视图中的行,
Sys.objects
目录视图称为基础视图,其中
sys.Tables
称为派生视图。
Sys.Tables
将仅返回表对象的行,而
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/


12
投票

已编辑

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

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

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

END

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

3
投票
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

0
投票

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

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

您可以在 if 块内创建表。


0
投票

类似这样的事情:

if not exists (select Top 1 name from sys.all_objects obj 
                   where obj.schema_id=schema_id() and obj.object_id=object_id(N'[dbo].[TestTable]') and obj.type in (N'U') )
    
    BEGIN
      CREATE TABLE [dbo].[TestTable]
      (
        [Id] [bigint] IDENTITY (1,1) NOT NULL,  
        [Name] [nvarchar](20) NULL,
        CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED
        (
          [Id] ASC    
        ) ON [PRIMARY]
      ) ON [PRIMARY]
    END

-2
投票

如果我没记错的话,这应该可行:

    if not exists (Select 1 from tableName)
create table ...
© www.soinside.com 2019 - 2024. All rights reserved.