工做中偶爾會出現:想用A數據表替換B數據表,而後把B數據表刪除。可是,又不知道B數據表在哪一個視圖、存儲過程、函數、觸發器中使用過?架構
通過一番度娘,看到實現方法也不難,主要涉及兩個系統表:sysobjects及syscomments。函數
一、先來複習一下sysobjects表結構。ui
列名加密 |
數據類型spa |
描述.net |
name日誌 |
sysnamecode |
對象名。對象 |
idblog |
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
二、順便記錄一下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].[表名]
三、言歸正傳,重點來了:好比查一個表如[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 類型
結果以下: