如何检查表是否存在,如果它不存在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 ...