修改資料表結構或預存程序前,必須找出所有相依物件(檢視表、函數、觸發器、其他 SP 等)。手工搜尋 syscomments 易漏、跨資料庫更麻煩。本文介紹兩個實用工具預存程序,快速定位相關物件。
FindObject_usp —— 跨資料庫物件名稱搜尋| 參數 | 型別 | 預設 | 說明 |
|---|---|---|---|
| @objname | varchar(200) | NULL | 搜尋關鍵字,支援萬用字元 % |
| @objtype | varchar(20) | NULL | 物件類型過濾(見下表),NULL 表全部 |
| 代碼 | 中文名稱 | 類型描述 |
|---|---|---|
| C / CHECK | CHECK 約束 | CHECK constraint |
| D / Default | 預設值/DEFAULT 約束 | Default constraint |
| F / FOREIGN KEY | 外鍵約束 | Foreign Key constraint |
| L / Log | 交易記錄 | Transaction log |
| FN | 標量函數 | Scalar function |
| IF | 內嵌資料表函數 | Inlined table-valued function |
| P | 預存程序 | Stored Procedure |
| PK | 主鍵約束 | Primary Key constraint |
| RF | 複寫篩選預存程序 | Replication filter procedure |
| S | 系統表 | System table |
| TF | 資料表函數 | Table-valued function |
| TR | 觸發器 | Trigger |
| U / User table | 使用者資料表 | User table |
| UQ | UNIQUE 約束 | Unique constraint |
| V / VIEW | 檢視表 | View |
| X | 擴展預存程序 | Extended stored procedure |
-- 1. 所有資料庫搜尋含 'bak' 的所有物件
EXEC FindObject_usp '%bak%';
-- 2. 僅搜尋使用者資料表
EXEC FindObject_usp '%bak%', 'User table';
-- 或 EXEC FindObject_usp '%bak%', 'U';
-- 3. 僅搜尋預存程序
EXEC FindObject_usp '%bak%', 'Stored procedure';
-- 或 EXEC FindObject_usp '%bak%', 'P';
sp_Occurrences —— 可程式物件內文本搜尋FindObject_usp:搜尋物件名稱(metadata),跨資料庫。sp_Occurrences:搜尋物件定義內文本(如 SP 內的 SQL 字串、變數名),僅限當前資料庫。USE TargetDatabase;
GO
EXEC sp_Occurrences 'bak'; -- 找出所有可程式物件定義中出現 'bak' 的位置
原版 sp_Occurrences 僅支援單一資料庫。若需跨庫,可參考以下模式自行擴充:
CREATE PROCEDURE dbo.sp_Occurrences_AllDBs @SearchTerm VARCHAR(200)
AS
BEGIN
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql = @sql + N'
USE [' + name + N'];
EXEC sp_Occurrences @SearchTerm;'
FROM sys.databases
WHERE state_desc = 'ONLINE' AND database_id > 4; -- 排除系統庫
EXEC sp_executesql @sql, N'@SearchTerm VARCHAR(200)', @SearchTerm;
END
SELECT * FROM sys.sql_modules WHERE definition LIKE '%bak%'(單庫)。FindObject_usp 與 sp_Occurrences 是經典 DBA 工具箱必備,雖然新版 SSMS 已內建類似功能,但在自動化腳本、CI/CD 管線前置檢查、舊版環境(2005/2008/2012)中仍具不可替代價值。建議部署至 master 或專用工具資料庫,並納入變更管理 SOP。