对以下对象判断是否存在:database、table、proc、触发器、临时表、索引。对于这些对象的判断是通过数据表 SysObjects来获得的。

一、基础知识

1、SysObjects系统表

对于这些对象的判断是通过数据表 SysObjects来获得的。运行 sp_help sysobjects ,如下图:

特别要注意 1、2、3、14。其中 name 表示对象的名称,id 表示SQL数据库分配给对象的 id 号,字段 xtype 和 type 均表示该对象的类型,类型如下:

xtype   type  表达的意思
C  CHECK 约束 
D  默认值或 DEFAULT 约束 
F  FOREIGN KEY 约束  
L  日志
FN   标量函数 
IF  内嵌表函数 
P  存储过程
PK K  PRIMARY KEY 约束
RF  复制筛选存储过程
S  系统表
TF   表函数
TR  触发器
U  用户表
UQ K  UNIQUE 约束
V  视图
X 扩展存储过程

2、sysdatabases系统表

  SQL  Server  上的每个数据库在表中占一行。该表存储在  master  数据库中。其中,重要的字段有下面两个。name (表示库的名字) dbid(表示库的ID)
 
 
 

dbid从1到4是系统的。包括 master、tempdb、model、msdb 这四个库。

可以利用SQL语句:select * from master.dbo.sysdatabases 查询出所有的库名.

 3、syscolumns系统表

  每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行。该表位于每一个数据库中。  包含所在数据库中的所有表的所有字段。
部分字段如下:
 
 
重要的字段包含以下几个。name(字段名称 )、  id(表ID号)、  colid(字段ID号)

4、object_id()和 Object_name()函数

  数据库中每个对像都有一个唯一的ID值,用Object_name(id)可以根据ID值得到对像的名称,object_id(name)可以根据对像名称得到对象的ID,但是 object_id() 只能返回用户创建的对像的ID,像以sys开头的表都是系统表所以返回不了。

(1)select object_id(对象名) <==> select id from sysobjects where name=对象名。注: 当指定临时表名时,除非当前数据库为 tempdb,否则必须在该临时表名之前加上数据库名称。 例如:SELECT OBJECT_ID('tempdb..#mytemptable')。

(2)select object_name(id号) <==> select name from sysobjects where id=id号

object_id () :返回架构范围内对象的数据库对象标识号。

语法:

OBJECT_ID ( '[ database_name . [ schema_name ] . | schema_name . ] object_name' [ ,'object_type' ] )或简化为:OBJECT_ID ( 'object_name' [ ,'object_type' ] )

参数:

  • object_name :要使用的对象。object_name 的数据类型为 varchar 或 nvarchar。如果 object_name 的数据类型为 varchar,则它将隐式转换为 nvarchar。可以选择是否指定数据库和架构名称。
  • object_type :架构范围的对象类型。object_type 的数据类型为 varchar 或 nvarchar。如果 object_type 的数据类型为 varchar,则它将隐式转换为 nvarchar。有关对象类型的列表,请参阅上面表格中的 type 列。
  • 返回类型 :int;对于空间索引,OBJECT_ID 返回 NULL;出现错误时,返回 NULL。用户只能查看 为该用户所有的安全对象,或已授予该用户对该安全对象的权限。 也就是说,如果用户对该对象没有任何权限,则那些会生成元数据的内置函数(如 OBJECT_ID)可能返回 NULL
5、OBJECTPROPERTY ()函数/ objectproperty()

  返回当前数据库中架构范围内的对象的有关信息。 有关架构范围内对象的列表,请参阅 sys.objects (Transact-SQL)。 不能将此函数用于不属于架构范围内的对象,如数据定义语言 (DDL) 触发器和事件通知。

语法:OBJECTPROPERTY ( id , property )
参数:

id:是表示当前数据库中架构范围内的对象 ID 的表达式。 id 的数据类型为 int。
property:一个表达式,表示要为 id 指定的对象返回的信息。 property 可以是下列值之一。

property 说明 返回值
IsCheckCnst CHECK 约束。 1 = True;0 = False
IsDefault 绑定的默认值。 1 = True;0 = False
IsDefaultCnst DEFAULT 约束。 1 = True;0 = False
IsExecuted 可执行对象(视图、过程、函数或触发器)。 1 = True;0 = False
IsEncrypted 是否已加密 1 = 已加密;0 = 未加密
IsPrimaryKey PRIMARY KEY 约束。 1 = True;0 = False;NULL = 非函数,或对象 ID 无效。
IsForeignKey FOREIGN KEY 约束。 1 = True;0 = False
IsIndexed 可以创建索引的表或视图。 1 = True;0 = False
IsProcedure 存储过程 1 = True;0 = False
IsScalarFunction 标量值函数。 1 = 标量值函数;0 = 非标量值函数
IsTableFunction 表值函数。 1 = 表值函数;0 = 非表值函数
IsSchemaBound 使用 SCHEMABINDING 创建的绑定到架构的函数或视图。 1 = 绑定到架构;0 = 不绑定到架构。
IsSystemTable 系统表。 1 = True;0 = False
IsTable 表。 1 = True;0 = False
IsTrigger 触发器。 1 = True;0 = False
IsUniqueCnst UNIQUE 约束。 1 = True;0 = False
IsUserTable 用户定义的表。 1 = True;0 = False
IsView 视图。 1 = True;0 = False

6、判断对象是否存在的方法

方法一:从 sysobjects 表中获取指定 名称 或者 id 的对象,并且通过OBJECTPROPERTY( id , property)函数证明其为指定的对象类型;

方法二:利用 OBJECT_ID ( 'object_name'  ,'object_type') 方法。当其 is not null 时即为指定类型对象;

方法三:从 sysobjects 表中获取指定 名称 或者 id 的对象,并且其 type 为指定值。

二、示例

1、判断数据库:

if exists (select * from sys.databases where name = ’数据库名’)  --从sys.databases表中获取
  PRINT '存在' 
ELSE 
  PRINT'不存在'

2、判断表:

方法一:

if exists (select * from dbo.SysObjects  where id = object_id(N'[表名]') and OBJECTPROPERTY(ID, 'IsTable') = 1) 
  PRINT '存在' 
ELSE 
  PRINT'不存在'

方法二:

if object_id(N'tablename',N'U') is not null
  print '存在'
else 
  print '不存在'

方法三:

if exists (select * from sysobjects where id = object_id(N'[表名]') and type in('S','U'))   --字段 type 值应为'S' 或 'U'
  print '存在'
else 
  print '不存在'

3、判断存储过程

方法一:

if exists (select * from sysobjects where id = object_id(N'[存储过程名]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
  print '存在'
else
  print '不存在'

方法二:

if object_id(N'tablename',N'P') is not null
  print '存在'
else 
  print '不存在'

方法三:

if exists (select * from sysobjects where id = object_id(N'[存储过程名]') and type in('S','P')) 
  print '存在'
else 
  print '不存在'

4、判断临时表

方法一:

if exists(select * from tempdb.dbo.sysobjects where id=object_id('tempdb.dbo.##TEMP_TBL'))
  PRINT '存在' 
ELSE 
  PRINT'不存在'

方法二:

if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb.dbo.#TEMP_TBL') and type='U')
  PRINT '存在' 
ELSE 
  PRINT'不存在'

  注:在判断临时表时,必须要在系统数据库 tempdb 中判断。

5、判断视图

--SQL Server 2000   
IF EXISTS (SELECT * FROM sysviews WHERE object_id = ’[dbo].[视图名]’  
--SQL Server 2005   
IF EXISTS (SELECT * FROM sys.views WHERE object_id = ’[dbo].[视图名]’

6、判断函数

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[函数名]’) and xtype in(N’FN’, N’IF’, N’TF’))    
drop function [dbo].[函数名]

7、判断列

方法一:

if exists(select * from syscolumns where id=object_id(’表名’) and name=’列名’)  
  alter table 表名 drop column 列名

方法二:

IF  EXISTS (SELECT   O.NAME AS 表名,C.NAME AS 列名 FROM SYSOBJECTS O INNER JOIN SYSCOLUMNS C ON O.ID=C.ID WHERE O.NAME= '表名' AND C.NAME   = '列名')
  PRINT '存在' 
ELSE 
  PRINT'不存在'

8、判断列是否自增列

if columnproperty(object_id(’table’),’col’,’IsIdentity’)=1  
  print ’自增列’  
else  
  print ’不是自增列’

获取指定表中的自增列
SELECT * FROM sys.columns WHERE object_id=OBJECT_ID(’表名’)  AND is_identity=1

9、 判断表中是否存在索引

if exists(select * from sysindexes where id=object_id(’表名’) and name=’索引名’)    
  print  ’存在’    
else    
  print  ’不存在

10 、查看数据库中对象

SELECT * FROM sys.sysobjects WHERE name=’对象名’

SqlServer——判断对象是否存在的更多相关文章

  1. 深入Java虚拟机--判断对象存活状态

    程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...

  2. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  3. [SQLServer大对象]——FileTable从文件系统迁移文件

    阅读导航 从文件系统中迁移文件到FileTable 批量加载文件到FileTable 如何批量加载文件到FileTable 通过博文[SQLServer大对象]——FileTable初体验,已经可以将 ...

  4. java虚拟机判断对象是否存活的方式

    引用计数算法:   给对象添加一个引用计数器,每当有地方应用时,计数器值就加一,当引用失效时,程序计数器就减一,只要引用计数器的值为零时,就表示对象不可能再被引用,例如微软的 component ob ...

  5. 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法

    获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...

  6. JavaScript中判断对象类型方法大全1

    我们知道,JavaScript中检测对象类型的运算符有:typeof.instanceof,还有对象的constructor属性: 1) typeof 运算符 typeof 是一元运算符,返回结果是一 ...

  7. freemarker判断对象是否为空

    freemarker中显示某对象使用 ${name}.   但如果name为null,freemarker就会报错.如果需要判断对象是否为空: <#if name??> …… </# ...

  8. 关于jquery判断对象是否为空

    1. jquery对象分为两种,一种是dom对象,dom对象会自带一个length属性,所以这种情况: obj.length == 0 可以判断对象为空 2. jquery也可以自定义对象,如 var ...

  9. JS/React 判断对象是否为空对象

    JS一般判断对象是否为空,我们可以采用: if(!x)的方式直接判断,但是如果是一个空对象,比如空的JSON对象,是这样的:{},简单的判断是不成功的,因为它已经占用着内存了,如果是JQuery的话, ...

随机推荐

  1. 斯特林公式求N!

        n!的长度为 ll ans = log10(2*pi*n)/2 + n*(log10(n/exp(1.0)))+1;  

  2. java集合转换成json时问题和解决方法

    json+hibernate死循环问题的一点见解,有需要的朋友可以参考下. [问题]如题所示,在我们使用hibernate框架而又需要将对象转化为json的时候,如果配置了双向的关联关系,就会出现这个 ...

  3. jQuery实现表格冻结行和列

    前几天,遇到一个需求是要将表格的前几行和前几列冻结即固定,就是在有滚动条的情况下,保持那几行和那几列固定,这个需求其实是一个非常常见的需求,因为在涉及好多行和列时,在拖动滚动条时,我们需要知道每行每列 ...

  4. mouseenter和hover的区别

    js中鼠标事件中,mouseenter和hover都可以达到,鼠标悬浮在目标上,触发事件,那么两者效果相同,有什么区别呢. 经过自己亲自试验.发现,mouseenter和hover还是有区别的. ho ...

  5. WebAPI序列化后的时间中含有“T”的解决方法

    问题: { "name": "abc", "time": "2015-02-10T15:18:21.7046433+08:00&q ...

  6. 机器学习(七)—Adaboost 和 梯度提升树GBDT

    1.Adaboost算法原理,优缺点: 理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络.对于决策树,Adaboost分类用了CART分类 ...

  7. gym强化学习入门demo——随机选取动作 其实有了这些动作和反馈值以后就可以用来训练DNN网络了

    # -*- coding: utf-8 -*- import gym import time env = gym.make('CartPole-v0') observation = env.reset ...

  8. deep learning 学习笔记(三) 线性回归学习速率优化寻找

    继续学习http://www.cnblogs.com/tornadomeet/archive/2013/03/15/2962116.html,上一节课学习速率是固定的,而这里我们的目的是找到一个比较好 ...

  9. Reinforcement Learning Q-learning 算法学习-2

    在阅读了Q-learning 算法学习-1文章之后. 我分析了这个算法的本质. 算法本质个人分析. 1.算法的初始状态是随机的,所以每个初始状态都是随机的,所以每个初始状态出现的概率都一样的.如果训练 ...

  10. 观后感|当幸福来敲门 The Pursuit of Happyness

    更好的阅读体验请点击:当幸福来敲门 The Pursuit of Happyness 看到时光机点亮的那一刻,我想儿子克里斯托夫正在侏罗纪的世界内探险,看着山川河流,穿梭在恐龙的脚下,在山洞中安稳的度 ...