工作中偶尔会出现:想用a数据表替换b数据表,然后把b数据表删除。但是,又不知道b数据表在哪个视图、存储过程、函数、触发器中使用过?
经过一番度娘,看到实现方法也不难,主要涉及两个系统表:sysobjects及syscomments。
1、先来复习一下sysobjects表结构。
|
列名 |
数据类型 |
描述 |
|
name |
sysname |
对象名。 |
|
id |
int |
对象标识号。 |
|
xtype |
char(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 = 扩展存储过程 |
|
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 约束 d = 默认值或 default 约束 f = foreign key 约束 fn = 标量函数 if = 内嵌表函数 k = primary key 或 unique 约束 l = 日志 p = 存储过程 r = 规则 rf = 复制筛选存储过程 s = 系统表 tf = 表函数 tr = 触发器 u = 用户表 v = 视图 x = 扩展存储过程 |
|
userstat |
smallint |
保留。 |
|
sysstat |
smallint |
内部状态信息。 |
|
indexdel |
smallint |
保留。 |
|
refdate |
datetime |
留用。 |
|
version |
int |
保留。 |
|
deltrig |
int |
保留。 |
|
instrig |
int |
保留。 |
|
updtrig |
int |
保留。 |
|
seltrig |
int |
保留。 |
|
category |
int |
用于发布、约束和标识。 |
|
cache |
smallint |
保留。 |
注:上表来源于:
2、顺便记录一下sysobjects的一些经典用法,比如说查表是否存在?
--方法1:
if exists (select 1 from dbo.sysobjects where id=object_id(n'[dbo].[表名]') and objectproperty(id, n'isusertable')=1)
drop table [dbo].[表名]
--方法2:
if exists (select 1 from sysobjects where xtype='u' and name='表名')
drop table [dbo].[表名]
3、言归正传,重点来了:比如查一个表如[rc_位数]在哪些代码中使用过?
select a.name 来源名称,b.text 代码内容,
case
when a.xtype='v' then '视图'
when a.xtype='p' then '存储过程'
when a.xtype='fn' then '标量函数'
when a.xtype='tf' then '表函数'
when a.xtype='tr' then '触发器'
else a.xtype
end 类型
from sysobjects a inner join syscomments b on a.id=b.id
where b.text like '%rc_位数%'
order by 类型
结果如下:
需要说明的是,假如代码如存储过程使用with encryption等方式加密过时,是查不到结果的。因为加密过的内容,在syscomments中会显示为null。
--rc_cost_co是加密过的存储过程
select a.name 来源名称,b.text 代码内容,
case
when a.xtype='v' then '视图'
when a.xtype='p' then '存储过程'
when a.xtype='fn' then '标量函数'
when a.xtype='tf' then '表函数'
when a.xtype='tr' then '触发器'
else a.xtype
end 类型
from sysobjects a inner join syscomments b on a.id=b.id
where a.name='rc_cost_co'
order by 类型
结果如下: