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

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

我该怎么做?

477133 次浏览

就像这样

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

如果我没错的话,这应该会奏效:

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

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

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

您可以在 if 块中创建表。

作为对比,我喜欢使用 object _ id 函数,如下所示。它更容易阅读,而且不必担心 sys.object 对 sysoobject 对 sys.all _ object 基本形式:

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'

编辑

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

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


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


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

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

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

这种方法的优点: INFORATION _ 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 数据库,我们也可以检查 Test数据库中 dbo模式中是否存在 tblTest表。

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视图除了返回 Table 对象的行之外,还返回对象的行,比如: 存储过程、视图等。

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

我们应该避免直接使用 sys.sysobjects系统表,在 Sql Server 的某些未来版本中将不建议直接访问它。根据[ Microsoft BOL ][1]链接,微软建议直接使用目录视图 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/

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