CREATE PROCEDURE Search_all_columns_string @DataToFind NVARCHAR(4000)
,@ExactMatch BIT = 0
AS
SET NOCOUNT ON
DECLARE @Temp TABLE (
RowId INT IDENTITY(1, 1)
,SchemaName SYSNAME
,TableName SYSNAME
,ColumnName SYSNAME
,DataType VARCHAR(100)
,DataFound BIT
)
INSERT INTO @Temp (
TableName
,SchemaName
,ColumnName
,DataType
)
SELECT C.Table_Name
,C.TABLE_SCHEMA
,C.Column_Name
,C.Data_Type
FROM Information_Schema.Columns AS C
INNER JOIN Information_Schema.Tables AS T ON C.Table_Name = T.Table_Name
AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
WHERE Table_Type = 'Base Table'
AND Data_Type IN (
'ntext'
,'text'
,'nvarchar'
,'nchar'
,'varchar'
,'char'
)
DECLARE @i INT
DECLARE @MAX INT
DECLARE @TableName SYSNAME
DECLARE @ColumnName SYSNAME
DECLARE @SchemaName SYSNAME
DECLARE @SQL NVARCHAR(4000)
DECLARE @PARAMETERS NVARCHAR(4000)
DECLARE @DataExists BIT
DECLARE @SQLTemplate NVARCHAR(4000)
SELECT @SQLTemplate = CASE
WHEN @ExactMatch = 1
THEN 'If Exists(Select *
From ReplaceTableName
Where Convert(nVarChar(4000), [ReplaceColumnName])
= ''' + @DataToFind + '''
)
Set @DataExists = 1
Else
Set @DataExists = 0'
ELSE 'If Exists(Select *
From ReplaceTableName
Where Convert(nVarChar(4000), [ReplaceColumnName])
Like ''%' + @DataToFind + '%''
)
Set @DataExists = 1
Else
Set @DataExists = 0'
END
,@PARAMETERS = '@DataExists Bit OUTPUT'
,@i = 1
SELECT @i = 1
,@MAX = MAX(RowId)
FROM @Temp
WHILE @i <= @MAX
BEGIN
SELECT @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName)
FROM @Temp
WHERE RowId = @i
PRINT @SQL
EXEC SP_EXECUTESQL @SQL
,@PARAMETERS
,@DataExists = @DataExists OUTPUT
IF @DataExists = 1
UPDATE @Temp
SET DataFound = 1
WHERE RowId = @i
SET @i = @i + 1
END
SELECT SchemaName
,TableName
,ColumnName
FROM @Temp
WHERE DataFound = 1
GO
Stackoverflow: How to search sql server database for string?