The following query will create a stored procedure
named SearchAllTables which will let you search all tables in the
database for a value.
It can be used the following ways:
- --Search for a column that exactly contains 'Test':
- exec SearchAllTables 'Test'
- --Search for a column that exactly contains 'Test' anywhere in it:
- exec SearchAllTables '%Test%'
Script:
- CREATE OR ALTER PROC
SearchAllTables
- (
- @SearchStr
nvarchar(100)
- )
- AS BEGIN
-
- CREATE TABLE
#Results (
- TableName nvarchar(70),
- 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 1=1
- AND
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
1=1
- AND
TABLE_SCHEMA = PARSENAME(@TableName, 2)
-
AND TABLE_NAME =
PARSENAME(@TableName, 1)
-
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int',
'decimal', 'uniqueidentifier')
-
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
- TableName,
- ColumnName,
- ColumnValue,
- COUNT(*)
as Count,
- Query
= CONCAT('SELECT * FROM ', TableName, ' WHERE ', ColumnName, ' LIKE ',
@SearchStr2)
- FROM
- #Results
- GROUP BY
- TableName,
ColumnName, ColumnValue
- ORDER BY
- TableName,
ColumnName, ColumnValue
- END
Once you run the above command, you can search all tables by
using the following command:
- EXEC SearchAllTables 'SearchTerm'