Question : SearchAllTables - doesn't search text fields

Hi,

I'm using the SearchAllTables stored procedure to search content of tables in my database.

I've found a slight limitation to this - it doesn't find strings saved in columns formated as 'text'.

I guess related question would be - is there a way how to display the contens of the field in Query Analyzer - I always get the (...) placeholder.

Cheers

Answer : SearchAllTables - doesn't search text fields

You could try something like this (untested):

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', 'text', 'ntext')
                         AND     QUOTENAME(COLUMN_NAME) > @ColumnName
               )
     
               IF @ColumnName IS NOT NULL
               BEGIN
                    INSERT INTO #Results
                    EXEC
                    (
                         'SELECT ''' + @TableName + '.' + @ColumnName + ''', SUBSTRING(' + @ColumnName + ', PATINDEX(' + @SearchStr2 + ', ' + @ColumnName + '), 100)
                         FROM ' + @TableName + ' (NOLOCK) ' +
                         ' WHERE PATINDEX(' + @SearchStr2 + ', ' + @ColumnName + ') > 0'
                    )
               END
          END    
     END

     SELECT ColumnName, ColumnValue FROM #Results
END
GO
Random Solutions  
 
programming4us programming4us