作業中偶爾會出現:想用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 型別
結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/31621.html
標籤:SQL Server
