接手舊系統時,資料庫缺乏文件,需快速找出某個值(如員工姓名 'forgot2000')分佈在哪些資料表、哪些欄位。手動逐表查詢不切實際,故撰寫通用預存程序自動掃描所有使用者資料表的字元型欄位(char/varchar/nchar/nvarchar)。
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'searchname' AND type = 'P')
DROP PROCEDURE searchname
GO
CREATE PROCEDURE searchname @sname VARCHAR(10)
AS
BEGIN
-- 暫存表收集結果
CREATE TABLE #TableList (
tablename CHAR(200),
colname CHAR(200)
)
DECLARE @table VARCHAR(200), @col VARCHAR(200)
SET NOCOUNT ON
-- 游標 1:走訪所有使用者資料表
DECLARE curTab CURSOR FOR
SELECT name FROM sysobjects WHERE xtype = 'U'
OPEN curTab
FETCH NEXT FROM curTab INTO @table
WHILE @@FETCH_STATUS = 0
BEGIN
-- 游標 2:走訪該表所有字元型欄位
DECLARE curCol CURSOR FOR
SELECT name FROM syscolumns
WHERE (xtype = 175 OR xtype = 167) -- varchar / char
AND id = (SELECT id FROM sysobjects WHERE name = @table)
OPEN curCol
FETCH NEXT FROM curCol INTO @col
WHILE @@FETCH_STATUS = 0
BEGIN
-- 動態 SQL:精確比對該欄位是否等於 @sname
EXEC('INSERT INTO #TableList SELECT ''' + @table + ''', ''' + @col + '''
FROM ' + @table + ' WHERE ' + @col + ' = ''' + @sname + '''')
FETCH NEXT FROM curCol INTO @col
END
CLOSE curCol
DEALLOCATE curCol
FETCH NEXT FROM curTab INTO @table
END
CLOSE curTab
DEALLOCATE curTab
SET NOCOUNT OFF
SELECT DISTINCT * FROM #TableList
DROP TABLE #TableList
END
GO
EXEC searchname 'forgot2000'
回傳欄位:tablename、colname,列出所有完全符合該字串的表/欄組合。執行速度視資料庫大小而定。
SQL Server 7.0 / 2000 測試通過。