USE master
GO
ALTER PROCEDURE [dbo].[sp_searchit] ( @val varchar(255), @escape char(1) = NULL, @table sysname = NULL )
AS
BEGIN
SET NOCOUNT ON
DECLARE @cols TABLE ( id int identity(1,1), colname sysname, tabname sysname )
DECLARE @results TABLE ( id int identity(1,1), colval varchar(max), colname sysname, tabname sysname )
DECLARE @id int
, @colname sysname
, @tabname sysname
, @sql nvarchar(4000)
INSERT INTO @cols ( colname, tabname )
SELECT A.name "colname"
, B.name "tabname"
FROM syscolumns A (NOLOCK)
INNER JOIN sysobjects B (NOLOCK)
ON A.id = B.id
WHERE A.type IN ( SELECT B.type FROM systypes B (NOLOCK) WHERE B.name IN ( 'char', 'varchar', 'text', 'nchar', 'nvarchar', 'ntext', 'sysname' ) )
AND B.type = 'U'
AND ( @table IS NULL OR B.name = @table )
SELECT @id = max(id)
FROM @cols
WHILE @id > 0
BEGIN
SELECT @colname = A.colname
, @tabname = A.tabname
FROM @cols A
WHERE A.id = @id
SET @sql = 'SELECT TOP 1 [' + @colname + '] "result", ''' + @colname + ''' "column", ''' + @tabname + ''' "table" FROM [' + @tabname + '] WHERE [' + @colname + '] LIKE ''%' + @val + '%'''
IF @escape IS NOT NULL
BEGIN
SET @sql = @sql + ' ESCAPE ''' + @escape + ''''
END
INSERT INTO @results ( colval, colname, tabname )
EXEC sp_executesql @sql
SET @id = @id - 1
END
SELECT *
FROM @results
END --sp_searchit
GO