IF_ EXISTS 在创建procedure及trigger等一系列东东时的用法.

转自

http://book.51cto.com/art/200908/146003.htm


13.2  IF EXISTS

我的工作是编写可以重复运行的脚本,即利用这些脚本创建的对象,也必须能重复运行。如本章所述,如果试图创建已存在的对象,就会出错。那么,如何创建已存在的对象呢?这很简单,可以先删除该对象,或者把对象的创建封装在条件逻辑中,然后再创建它。

在使用第一种方法时,要先删除已存在的对象,因为新对象与旧对象同名,但操作是不同的。此时可使用IF EXISTS语句测试该对象是否存在。如果存在,就删除它,再创建新对象。如下面的示例所示:

 
 
  1. IF EXISTS  
  2. (SELECT *  
  3. FROM sys.objects  
  4. WHERE name = 'spDeleteCreditCard' 
  5. AND type_desc = 'SQL_STORED_PROCEDURE')  
  6. DROP PROCEDURE spDeleteCreditCard  
  7. GO  
  8. CREATE PROCEDURE spDeleteCreditCard  
  9. @CreditCardID Int 
  10. AS 
  11. DELETE Sales.CreditCard  
  12. WHERE CreditCardID = @CreditCardID 

使用EXISTS关键字的第二种方法是使用IF NOT EXISTS语句。此时,可以检查对象是否存在,如果存在,就不能重复创建,如下面的示例所示:

 
 
  1. IF NOT EXISTS  
  2. (SELECT *  
  3. FROM INFORMATION_SCHEMA.TABLES  
  4. WHERE TABLE_NAME = 'CreditCard' 
  5. AND TABLE_SCHEMA = 'Sales' 
  6. AND TABLE_TYPE = 'BASE TABLE')  
  7. CREATE TABLE Sales.CreditCard  
  8. (CreditCardID int IDENTITY(1,1) NOT NULL,  
  9. CardType nvarchar(50) NOT NULL,  
  10. CardNumber nvarchar(25) NOT NULL,  
  11. ExpMonth tinyint NOT NULL,  
  12. ExpYear smallint NOT NULL,  
  13. ModifiedDate datetime NOT NULL,  
  14. CONSTRAINT PK_CreditCard_CreditCardID  
  15. PRIMARY KEY CLUSTERED (CreditCardID)) 

对IF NOT EXISTS语句的限制是,在处理一些对象(如存储过程)时,CREATE OBJECT语句必须是批处理中的第一个命令。因此虽然IF NOT EXISTS语句无效,但该语句可以很好地处理表、视图和约束。

--------------------------------------------------------------第一转载结束--------------------------------------------


后来发现上面sys.objects表与sysobjects不是同一个表

select count(*)
from sys.objects
--67

select count(*)
from sysobjects


1808


再在其它地方也发现

用object_id来进行一些比较会更好.

语法

 
OBJECT_ID ( 
    '[ database_name . [ schema_name ] . | schema_name . ]     object_name' [ ,'object_type' ] )


IF OBJECT_ID (N'dbo.F_DSS_CombineState', N'FN') IS NOT NULL
DROP FUNCTION dbo.[F_DSS_CombineState];


而object


下面的例子转自http://hi.baidu.com/l6834279/blog/item/b858e4f4833f5e67dcc4745c.html

SQL Server的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、则、存储过程等,每个对象在表中占一行。

        以下是此系统表的字段名称和相关说明。

列名数据类型描述
namesysname对象名。
Idint对象标识号。
xtypechar(2)对象类型。可以是下列对象类型中的一种:

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

uidsmallint所有者对象的用户 ID。
infosmallint保留。仅限内部使用。
statusint保留。仅限内部使用。
base_schema_
ver
int保留。仅限内部使用。
replinfoint保留。供复制使用。
parent_objint父对象的对象标识号(例如,对于触发器或约束,该标识号为表 ID)。
crdatedatetime对象的创建日期。
ftcatidsmallint为全文索引注册的所有用户表的全文目录标识符,对于没有注册的所有用户表则为 0。
schema_verint版本号,该版本号在每次表的架构更改时都增加。
stats_schema_
ver
int保留。仅限内部使用。
typechar(2)对象类型。可以是下列值之一:

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

userstatsmallint保留。
sysstatsmallint内部状态信息。
indexdelsmallint保留。
refdatedatetime留作以后使用。
versionint留作以后使用。
deltrigint保留。
instrigint保留。
updtrigint保留。
seltrigint保留。
categoryint用于发布、约束和标识。
cachesmallint保留。

      当xtype='U' and status>0代表是用户建立的表,对象名就是表名,对象ID就是表的ID值。

      用以下代码就可以列出库misa中所有的用户建立的表名。

         select * from misa.dbo.sysobjects
        
where xtype = ' U ' and status > 0

      以用友数据库use ufdata_888_2004为例:

SQL Code
       --查询数据库ufdata_888_2004的用户表
            select * from sysobjects
            
where xtype = 'u' and name like 'fa_%'
            
order by name

       --查询数据库ufdata_888_2004的存储过程
            select * from sysobjects
            where xtype = 'p' and name like 'fa_%'
             order by name


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值