如何检查表是否存在,如果它不存在sql server 2008中创build表

我正在写一个SQL Server 2008中的Stored procedure我需要检查数据库中是否存在一个table ,如果它不,那么我需要创build它。

我该怎么做?

像这样的东西

 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 

仅仅为了对比,我喜欢使用object_id函数,如下所示。 这是一个更容易阅读,你不必担心sys.objects与sysobjects与sys.all_objects与sys.tables。 基本forms:

 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' 

EDITED

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

 IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = N'YourTable' AND type = 'U') BEGIN CREATE TABLE [SchemaName].[YourTable]( .... .... .... ) END 

让我们用下面的脚本创build一个带有表格的示例数据库:

 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 

指定表名的数据库名称和模式名称部分是可选的。 但是,指定数据库名称和模式名称可以select检查指定数据库中和指定模式中表的存在,而不是检查所有模式中的当前数据库。 以下查询显示即使当前数据库是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()函数的其他值得一提的是:它提供了一个选项来检查在当前连接上下文中创build的临时表的存在。 所有其他方法检查在所有连接上下文中创build的临时表的存在,而不仅仅是当前的连接上下文。 下面的查询显示如何使用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目录视图inheritanceSys.Tables目录视图中的行, Sys.objects目录视图被称为基本视图,其中as sys.Tables被称为派生视图。 Sys.Tables将只返回表格对象的行,而Sys.Object视图除了返回表格对象的行之外,它将返回类似存储过程,视图等对象的行。

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

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

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

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

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

你可以在if块内创build表。

如果我没有错,这应该工作:

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