Search a string in entire datababe

  • Is there a script to search a string stored in all cell of all tables?
    For example, I want to find out MEMBER_FIRST_NAME='JOHN'.

  • So you only want to look in columns called MEMBER_FIRST_NAME?  Or do you want to look in all columns?  If it's just the one column name, query INFORMATION_SCHEMA.COLUMNS to find out what tables have that column, and write a separate query for each table returned.  If it's all columns, it's just too tedious.  Get Redgate's SQL Search or something similar to make your life much easier.

    John

    Edit - changed "like" to "life"

  • Take a look at SQL Down Under and their SDU Tools for FindStringWithinADatabase.  But what you want is not fast and is a very dirty operation.

    If "MEMBER_FIRST_NAME" is a column I would recommend looking through the sys.columns view and building a SQL statement that way instead.

  • Sorry, I did not describe clearly.
    I want to search all columns, all cells in which store the string "John"

  • adonetok - Wednesday, August 16, 2017 8:09 AM

    Sorry, I did not describe clearly.
    I want to search all columns, all cells in which store the string "John"

    Then you want something like the SDU Tool I already detailed.

    I would question the need to do this as it wont be quick and is a very dirty thing to do.

  • If got a stored procedure I use for searching for a string in a database:
    IF NOT EXISTS(SELECT 1
          FROM INFORMATION_SCHEMA.ROUTINES
         WHERE ROUTINE_NAME = 'INFSearchAllTables'
          AND ROUTINE_TYPE = N'PROCEDURE')
    BEGIN
      EXEC ('CREATE PROCEDURE [dbo].[INFSearchAllTables] AS BEGIN')
    END
    GO

    GO
    -- **********************************************************************
    -- Purpose: To search all columns of all tables for a given search string
    -- Sample Usage: EXEC INFSearchAllTables 'nxec', 'Orders'
    -- $Revision: 1.5 $
    -- **********************************************************************
    ALTER PROC INFSearchAllTables
    (
      @SearchStr    nvarchar(100),
      @ExcludeTablesList nvarchar(Max) = '', -- CSV List e.g.: 'myTable1,myTable2' of tables not to be included in search
      @TableNotLike   nvarchar(Max) = '', -- e.g.: 'tmp%'
      @TableLike    nvarchar(Max) = '%',
      @Debug     bit = 0 -- Whether to just output the selects without execution
    )
    AS
    BEGIN

      SET NOCOUNT ON

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

      DECLARE @TableName nvarchar(256)
      DECLARE @ColumnName nvarchar(128)
      DECLARE @SearchStr2 nvarchar(110)
      DECLARE @sSQL   nvarchar(Max)
      DECLARE @NewLine  nvarchar(Max)
      SET @NewLine = CHAR(13) + CHAR(10)

      SET @TableName = ''
      SET @SearchStr2 = QuoteName('%' + @SearchStr + '%','''')

      WHILE @TableName IS NOT NULL
       BEGIN
        SET @ColumnName = ''
        SELECT @TableName = 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
         AND NOT EXISTS (SELECT 1
               FROM dbo.chrSplitList(@ExcludeTablesList,',')
               WHERE Value = TABLE_NAME)
         AND TABLE_NAME LIKE @TableLike
         AND TABLE_NAME NOT LIKE @TableNotLike
        WHILE (@TableName IS NOT NULL)
           AND (@ColumnName IS NOT NULL)
          BEGIN
           SELECT @ColumnName = 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
              SET @sSQL = 'SELECT ''' + @TableName + ''',''' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)' + @NewLine +
                  ' FROM ' + @TableName + ' WITH (NOLOCK)' + @NewLine +
                  ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2 + @NewLine + @NewLine
              IF @Debug = 0
               BEGIN
                INSERT INTO #Results
                (
                  TableName,
                  ColumnName,
                  ColumnValue
                )
                EXEC (@sSQL)
               END
              ELSE
               BEGIN
                PRINT @sSQL
               END
              --END IF
            END
           --END IF
          END
        --END WHILE
       END
      --END WHILE

      SELECT R.TableName,
        R.ColumnName,
        R.ColumnValue
      FROM #Results R
      ORDER BY R.ColumnName, R.ColumnValue

    END
    GO

  • Thank you for help.
    Got an error 
    Invalid object name 'dbo.chrSplitList'
    Is dbo.chrSplitList a function?

  • adonetok - Wednesday, August 16, 2017 9:04 AM

    Thank you for help.
    Got an error 
    Invalid object name 'dbo.chrSplitList'
    Is dbo.chrSplitList a function?

    -- Splits a string into rows
    CREATE FUNCTION [dbo].[chrSplitList]
    (
      @list   nvarchar(MAX),
      @separator nvarchar(MAX) = ';'
    )
    RETURNS @table TABLE (Value nvarchar(4000))
    AS BEGIN

     DECLARE @position INT, @previous INT
     SET @list = @list + @separator
     SET @previous = 1
     SET @position = CHARINDEX(@separator, @list)
     WHILE @position > 0 BEGIN
      IF @position - @previous > 0
       INSERT INTO @table VALUES (SUBSTRING(@list, @previous, @position - @previous))
      IF @position >= LEN(@list) BREAK
      SET @previous = @position + LEN(@separator)
      SET @position = CHARINDEX(@separator, @list, @previous)
     END
     RETURN
    END
    GO

  • adonetok - Wednesday, August 16, 2017 7:42 AM

    Is there a script to search a string stored in all cell of all tables?
    For example, I want to find out MEMBER_FIRST_NAME='JOHN'.

    As an fyi, Red Gate has a free tool called SQL Search - or at least it used to be free - that will do all this and many more things for you.  It is great for doing metadata research and is a plug in for SSMS.

  • Red-gate only search for object name not string stored in cell

Viewing 10 posts - 1 through 9 (of 9 total)

You must be logged in to reply to this topic. Login to reply