[sql help] I need to search an entire SQL database for a specific value.

For instance, I don't care what table/view it's in, I just need to find anywhere that a specific term, like "Bob" is used.

Easy way to do this?

[SQL 2000, running on Windows 2003 Server]
 
This is the easiest way I've found.

Replace SEARCH with the word you want to find, and run this in query analyzer (with the relevant DB selected).

---This will return a select * statement for all columns and all tables within a <database> with a text type ending in 'char'
-- declare values to assign to

declare @tblname nvarchar(75), @colname nvarchar(75), @sqlstr nvarchar(200)

-- declare cursor

declare curthe cursor for

SELECT
sysobjects.name,
syscolumns.[name]
FROM
syscolumns RIGHT OUTER JOIN
sysobjects
on syscolumns.ID = sysobjects.ID
where sysobjects.xtype = 'u' and right(type_name(syscolumns.xusertype),4) = 'char'


open curthe;

-- Create infinite loop

while 1=1

begin

-- fetch data
fetch curthe into @tblname,@colname
-- check fetch status
if @@fetch_status <> 0
break;

select @sqlstr = 'select ''' + @tblname + ''' as TABLENAME, [' + @colname + '] from [' + @tblname + '] where [' + @colname + '] like ''%SEARCH%'''
print @sqlstr

--exec @sqlstr

end


-- clean up

close curthe;

deallocate curthe;

Then paste the results back into QA (with "Results in Text" instead of grid).
 
Here's a slightly better script (eg no cursors and wrapped into a sp) than the one Celchu posted.

Code:
CREATE PROC SearchAllTables
(
	@SearchStr nvarchar(100)
)
AS
BEGIN
	-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
	-- Purpose: To search all columns of all tables for a given search string
	-- Written by: Narayana Vyas Kondreddi
	-- Site: http://vyaskn.tripod.com
	-- Tested on: SQL Server 7.0 and SQL Server 2000
	-- Date modified: 28th July 2002 22:50 GMT

	CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))

	SET NOCOUNT ON

	DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
	SET  @TableName = ''
	SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')

	WHILE @TableName IS NOT NULL
	BEGIN
		SET @ColumnName = ''
		SET @TableName = 
		(
			SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
			FROM 	INFORMATION_SCHEMA.TABLES
			WHERE 		TABLE_TYPE = 'BASE TABLE'
				AND	QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
				AND	OBJECTPROPERTY(
						OBJECT_ID(
							QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
							 ), 'IsMSShipped'
						       ) = 0
		)

		WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
		BEGIN
			SET @ColumnName =
			(
				SELECT MIN(QUOTENAME(COLUMN_NAME))
				FROM 	INFORMATION_SCHEMA.COLUMNS
				WHERE 		TABLE_SCHEMA	= PARSENAME(@TableName, 2)
					AND	TABLE_NAME	= PARSENAME(@TableName, 1)
					AND	DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
					AND	QUOTENAME(COLUMN_NAME) > @ColumnName
			)
	
			IF @ColumnName IS NOT NULL
			BEGIN
				INSERT INTO #Results
				EXEC
				(
					'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
					FROM ' + @TableName + ' (NOLOCK) ' +
					' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
				)
			END
		END	
	END

	SELECT ColumnName, ColumnValue FROM #Results
END


GO
 
Last edited:
Back
Top