Thursday, September 27, 2007

SQL: Search Procedure

This is another useful tool.

This Stored Procedure will allow for searching every table and every field and return a passed value. Essentially, if you forgot where something was, you could use this as a diagnostic tool. It is not recommended for programmatic execution as you could imagine, dependent on optimization of your db structure it could take a while.

/****** Object: StoredProcedure [dbo].[SearchAllTables] Script Date: 09/27/2007 10:06:17 ******/

SET
ANSI_NULLS
ON

GO

SET
QUOTED_IDENTIFIER
ON

GO

ALTER
PROC [dbo].[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


The utilization would be something like:

SearchAllTables 'MyValueToFind'


Output would be something like:

ColumnName

Column Value

[dbo].[MyTable].[MyField1]

http://myValueToFind.net

[dbo].[MyTable].[MyField2]

http://myValueToFind.net/morevalues

No comments: