工作中偶尔会出现:想用A数据表替换B数据表,然后把B数据表删除。但是,又不知道B数据表在哪个视图、存储过程、函数、触发器中使用过? 经过一番度娘,看到实现方法也不难,主要涉及两个系统表:sysobjects及syscomments。 1、先来复习一下sysobjects表结构。
注:上表来源于: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 类型 结果如下:
|
|