转自
http://book.51cto.com/art/200908/146003.htm
13.2 IF EXISTS
我的工作是编写可以重复运行的脚本,即利用这些脚本创建的对象,也必须能重复运行。如本章所述,如果试图创建已存在的对象,就会出错。那么,如何创建已存在的对象呢?这很简单,可以先删除该对象,或者把对象的创建封装在条件逻辑中,然后再创建它。
在使用第一种方法时,要先删除已存在的对象,因为新对象与旧对象同名,但操作是不同的。此时可使用IF EXISTS语句测试该对象是否存在。如果存在,就删除它,再创建新对象。如下面的示例所示:
- IF EXISTS
- (SELECT *
- FROM sys.objects
- WHERE name = 'spDeleteCreditCard'
- AND type_desc = 'SQL_STORED_PROCEDURE')
- DROP PROCEDURE spDeleteCreditCard
- GO
- CREATE PROCEDURE spDeleteCreditCard
- @CreditCardID Int
- AS
- DELETE Sales.CreditCard
- WHERE CreditCardID = @CreditCardID
使用EXISTS关键字的第二种方法是使用IF NOT EXISTS语句。此时,可以检查对象是否存在,如果存在,就不能重复创建,如下面的示例所示:
- IF NOT EXISTS
- (SELECT *
- FROM INFORMATION_SCHEMA.TABLES
- WHERE TABLE_NAME = 'CreditCard'
- AND TABLE_SCHEMA = 'Sales'
- AND TABLE_TYPE = 'BASE TABLE')
- CREATE TABLE Sales.CreditCard
- (CreditCardID int IDENTITY(1,1) NOT NULL,
- CardType nvarchar(50) NOT NULL,
- CardNumber nvarchar(25) NOT NULL,
- ExpMonth tinyint NOT NULL,
- ExpYear smallint NOT NULL,
- ModifiedDate datetime NOT NULL,
- CONSTRAINT PK_CreditCard_CreditCardID
- 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的每个数据库内都有此系统表,它存放该数据库内创建的所有对象,如约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。
以下是此系统表的字段名称和相关说明。
列名 | 数据类型 | 描述 |
---|---|---|
name | sysname | 对象名。 |
Id | int | 对象标识号。 |
xtype | char(2) | 对象类型。可以是下列对象类型中的一种: C = CHECK 约束 |
uid | smallint | 所有者对象的用户 ID。 |
info | smallint | 保留。仅限内部使用。 |
status | int | 保留。仅限内部使用。 |
base_schema_ ver | int | 保留。仅限内部使用。 |
replinfo | int | 保留。供复制使用。 |
parent_obj | int | 父对象的对象标识号(例如,对于触发器或约束,该标识号为表 ID)。 |
crdate | datetime | 对象的创建日期。 |
ftcatid | smallint | 为全文索引注册的所有用户表的全文目录标识符,对于没有注册的所有用户表则为 0。 |
schema_ver | int | 版本号,该版本号在每次表的架构更改时都增加。 |
stats_schema_ ver | int | 保留。仅限内部使用。 |
type | char(2) | 对象类型。可以是下列值之一: C = CHECK 约束 |
userstat | smallint | 保留。 |
sysstat | smallint | 内部状态信息。 |
indexdel | smallint | 保留。 |
refdate | datetime | 留作以后使用。 |
version | int | 留作以后使用。 |
deltrig | int | 保留。 |
instrig | int | 保留。 |
updtrig | int | 保留。 |
seltrig | int | 保留。 |
category | int | 用于发布、约束和标识。 |
cache | smallint | 保留。 |
当xtype='U' and status>0代表是用户建立的表,对象名就是表名,对象ID就是表的ID值。
用以下代码就可以列出库misa中所有的用户建立的表名。
where xtype = ' U ' and status > 0
以用友数据库use ufdata_888_2004为例:
--查询数据库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