工作中偶尔会出现:想用A数据表替换B数据表,然后把B数据表删除。但是,又不知道B数据表在哪个视图、存储过程、函数、触发器中使用过? 经过一番度娘,看到实现方法也不难,主要涉及两个系统表:sysobjects及syscomme
工作中偶尔会出现:想用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 |
保留。 |
注:上表来源于:https://blog.csdn.net/xuchaofu/article/details/3458716
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 类型
结果如下:
--结束END--
本文标题: 查询代码在哪个视图、存储过程、函数、触发中使用过
本文链接: https://www.lsjlt.com/news/1889.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-14
2024-05-14
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0