How to search sql server database for string?


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?