工作中偶爾會出現:想用A數據表替換B數據表,然後把B數據表刪除。但是,又不知道B數據表在哪個視圖、存儲過程、函數、觸發器中使用過? 經過一番度娘,看到實現方法也不難,主要涉及兩個系統表:sysobjects及syscomments。 1、先來複習一下sysobjects表結構。 列名 數據類型 描述 ...
工作中偶爾會出現:想用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 類型
結果如下: