/*
追加描述:
一、改腳本回去遍歷每一個數據庫的每一個架構下面的全部表的列
二、在消息選項卡里面會列出表和列以及查詢語句
三、結果存儲在臨時表#Results。您能夠查詢這個表,在同一會話中進一步細化的結果,或刪除GROUP BY查看詳細的數據。sql
警告:
*由於這個腳本要遍歷數據庫中全部的表和列,它可能須要很長的時間來處理。
*您最初的測試能夠運行在一個單一的表或列,看看你的系統負載狀況。數據庫
*/
DECLARE @MaxRows INT ;
DECLARE @MinRows INT ;
DECLARE @FilterSchema NVARCHAR(255) ;
DECLARE @FilterTable NVARCHAR(255) ;
DECLARE @FilterColumn NVARCHAR(255) ;
DECLARE @Characters NVARCHAR(MAX) ;架構
-- 要搜索的文本值
SET @Characters='你是我生命中最美的相遇'oop
-- 過濾表的最小和最大的行數,用此來限定目標表的範圍
-- a. MinRows = 0 表示搜索全部的表, 1 表示搜索包含有數據的表.
-- b. MaxRows = null 表示搜索全部的表, > 0 表示搜索的表中的總行數小於這個值.
SET @MaxRows=null ;
SET @MinRows=1 ;測試
-- 下面三個變量分別用來配置架構、表和列的;這些值都使用 Like %Name% 模糊查詢
-- Names are compared using Like %Name%
SET @FilterSchema=NULL ;
SET @FilterTable=NULL ;
SET @Filtercolumn=NULL ;ip
--**********************Script begins****************************
--***************************************************************
SET NOCOUNT ON
DECLARE @SchemaT TABLE
(
RowID INT IDENTITY(1 , 1) ,
SchemaName NVARCHAR(MAX) ,
TableName NVARCHAR(MAX) ,
ColumnName NVARCHAR(MAX)
)
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
BEGIN
DROP TABLE #Results
END
CREATE TABLE #Results
(
RowID INT IDENTITY(1 , 1) ,
RSchemaName NVARCHAR(MAX) DEFAULT '' ,
RTableName NVARCHAR(MAX) DEFAULT '' ,
RColumnName NVARCHAR(MAX) DEFAULT '' ,
Value NTEXT DEFAULT ''
)字符串
DECLARE @LoopNo INT ,
@TotalRows INT ,
@Schema NVARCHAR(MAX) ,
@Table NVARCHAR(MAX) ,
@Column NVARCHAR(MAX) ,
@SQL NVARCHAR(MAX) ,
@ParamDef NVARCHAR(MAX) ,
@DataExists BIT
DECLARE @ReturnValue NVARCHAR(MAX)
DECLARE @ParmDefinition NVARCHAR(MAX)it
--****************************************************************************************************
-- 查找知足條件的全部信息到表變量@SchemaT裏面,其中包括架構、表名、列名和表的大小
--****************************************************************************************************
INSERT INTO @SchemaT (SchemaName , TableName , ColumnName)
SELECT Sch = t.Sch , Tbl = REPLACE(REPLACE(t.Tbl , '[' , '[[') , ']' , ']]') , Col = c.name
FROM (
SELECT s.Name AS Sch , t.name AS Tbl , t.object_id , SUM(p.rows) AS NumCount
FROM sys.schemas s
LEFT JOIN sys.tables t
ON s.schema_id = t.schema_id
LEFT JOIN sys.partitions p
ON t.object_id = p.object_id
LEFT JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE p.index_id IN (0 , 1) -- 0 heap table , 1 table with clustered index
AND p.rows IS NOT NULL
AND a.type = 1 -- row-data only , not LOB
AND (
s.name LIKE '%'+@FilterSchema+'%'
OR @FilterSchema IS NULL
)
AND (
t.name LIKE '%'+@FilterTable+'%'
OR @FilterTable IS NULL
)
GROUP BY s.Name , t.name , t.object_id
HAVING (
SUM(p.rows) >= @MinRows
AND (
SUM(p.rows) <= @MaxRows
OR @MaxRows IS NULL
)
)
) T
INNER JOIN sys.columns C
ON T.object_id = c.object_id
INNER JOIN sys.types P
ON C.system_type_id = p.system_type_id
WHERE (
p.name LIKE '%char%'
OR p.name LIKE '%text%'
)
AND (
c.name LIKE '%'+@FilterColumn+'%'
OR @FilterColumn IS NULL
)
ORDER BY Sch , Tbl , Col
--**********************************************************************************
-- 拼接動態語句,並執行把結果插入到臨時表 #Results 裏面
--**********************************************************************************
SELECT @LoopNo=1 , @TotalRows=MAX(RowID)
FROM @SchemaT
PRINT '總計出現次數 = '+CAST(@TotalRows AS NCHAR(5))+CHAR(13)
WHILE @LoopNo <= @TotalRows
BEGIN
SELECT @Schema=SchemaName , @Table=TableName , @Column=ColumnName
FROM @SchemaT
WHERE RowID = @LoopNo
SET @SQL='SELECT '+QUOTENAME(@Column)+' FROM '+QUOTENAME(@Schema)+'.'+QUOTENAME(@Table)+' WHERE CHARINDEX('''+@Characters+''','+QUOTENAME(@Column)+') > 0'
--**********************************************************************************
-- 若是包含有指定的字符串,就輸出查詢語句和出現的此處以及表信息
--**********************************************************************************
IF @TotalRows >0
BEGIN
PRINT '出現位置: '+QUOTENAME(@Schema)+'.'+QUOTENAME(@Table)+'.'+QUOTENAME(@Column)
PRINT '出現次數: '+CAST(@LoopNo AS NCHAR(5))
PRINT '查詢語句: '+@SQL+CHAR(13)
END
--**********************************************************************************
SET @ParmDefinition='@ReturnValueOUT NVARCHAR(MAX) OUTPUT'
INSERT INTO #Results (Value)
EXECUTE sp_executesql
@SQL ,
@ParmDefinition ,
@ReturnValueOUT=@ReturnValue OUTPUT
UPDATE #Results
SET RTableName=@Table , RColumnName=@Column , RSchemaName=@Schema
WHERE RTableName = ''
SET @LoopNo=@LoopNo+1
ENDio
--**********************************************************************************
--顯示結果
--**********************************************************************************table
SELECT COUNT(*) AS Occurrences , RSchemaName , RTableName , RColumnNameFROM #ResultsGROUP BY RSchemaName , RTableName , RColumnName