當需要在整個資料庫中尋找包含特定關鍵字的資料,且不確定具體在哪張表、哪個欄位時,手工撰寫查詢極其繁瑣。本文提供一套動態產生 SQL 的方案,自動掃描所有使用者表的字串型欄位,並建立暫存函數批次產生查詢語句,最終一次性輸出所有符合條件的結果。
syscolumns、sysobjects、systypes 篩選出所有使用者表(xtype='u')的字串型欄位(varchar、nvarchar、char、nchar、text、ntext)。#t(原文用實體表 t,建議改為暫存表避免殘留)。udf_genSQL,接收表名與關鍵字,動態拼接 WHERE col1 LIKE '%keyword%' OR col2 LIKE '%keyword%' ... 條件。-- 1. 收集所有使用者表的字串型欄位
SELECT a.name AS columnname, OBJECT_NAME(a.id) AS tablename
INTO #t
FROM syscolumns a
JOIN sysobjects b ON a.id = b.id
JOIN systypes c ON a.xtype = c.xtype
WHERE b.xtype = 'u'
AND c.name IN ('varchar','nvarchar','char','nchar','text','ntext')
AND OBJECT_NAME(a.id) <> 't';
-- 2. 建立動態產生查詢的函數
CREATE FUNCTION dbo.udf_genSQL(@tableName VARCHAR(1000), @keyWord VARCHAR(1000))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @sql VARCHAR(8000);
SET @sql = 'SELECT * FROM ' + @tableName + ' WHERE 1=1 ';
SELECT @sql = @sql + ' OR ' + columnname + ' LIKE ''%' + @keyWord + '%'''
FROM #t
WHERE tablename = @tableName;
RETURN @sql;
END;
GO
-- 3. 逐表執行查詢
SELECT dbo.udf_genSQL(tablename, '目標關鍵字') FROM #t GROUP BY tablename;
-- 4. 清理環境
DROP TABLE #t;
DROP FUNCTION dbo.udf_genSQL;
text/ntext 已棄用,新專案請改用 varchar(max)/nvarchar(max),並相應調整類型篩選條件。SQL Server 2016+ 可考慮使用 Full-Text Search 或 Azure Cognitive Search 等專業全文檢索功能,效能與功能性均優於動態 SQL 方案。