Search for one value in any column of any table inside a database

前端 未结 7 1397
甜味超标
甜味超标 2020-11-29 17:15

Is there a way to search for one value (in my case it is a UID of the type char(64)) inside any column of any table inside one MS SQL Server database?

I

7条回答
  •  没有蜡笔的小新
    2020-11-29 17:51

    I expanded the code, because it's not told me the 'record number', and I must to refind it.

    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
    
    -- Copyright @ 2012 Gyula Kulifai. All rights reserved.
    -- Extended By: Gyula Kulifai
    -- Purpose: To put key values, to exactly determine the position of search
    -- Resources: Anatoly Lubarsky
    -- Date extension: 19th October 2012 12:24 GMT
    -- Tested on: SQL Server 10.0.5500 (SQL Server 2008 SP3)
    
    CREATE TABLE #Results (TableName nvarchar(370), KeyValues nvarchar(3630), ColumnName nvarchar(370), ColumnValue nvarchar(3630))
    
    SET NOCOUNT ON
    
    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
        ,@TableShortName nvarchar(256)
        ,@TableKeys nvarchar(512)
        ,@SQL nvarchar(3830)
    
    SET  @TableName = ''
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
    
    WHILE @TableName IS NOT NULL
    BEGIN
        SET @ColumnName = ''
    
        -- Scan Tables
        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
        )
        Set @TableShortName=PARSENAME(@TableName, 1)
        -- print @TableName + ';' + @TableShortName +'!' -- *** DEBUG LINE ***
    
            -- LOOK Key Fields, Set Key Columns
            SET @TableKeys=''
            SELECT @TableKeys = @TableKeys + '''' + QUOTENAME([name]) + ': '' + CONVERT(nvarchar(250),' + [name] + ') + ''' + ',' + ''' + '
             FROM syscolumns 
             WHERE [id] IN (
                SELECT [id] 
                 FROM sysobjects 
                 WHERE [name] = @TableShortName)
               AND colid IN (
                SELECT SIK.colid 
                 FROM sysindexkeys SIK 
                 JOIN sysobjects SO ON 
                    SIK.[id] = SO.[id]  
                 WHERE 
                    SIK.indid = 1
                    AND SO.[name] = @TableShortName)
            If @TableKeys<>''
                SET @TableKeys=SUBSTRING(@TableKeys,1,Len(@TableKeys)-8)
            -- Print @TableName + ';' + @TableKeys + '!' -- *** DEBUG LINE ***
    
        -- Search in Columns
        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
            ) -- Set ColumnName
    
            IF @ColumnName IS NOT NULL
            BEGIN
                SET @SQL='
                    SELECT 
                        ''' + @TableName + '''
                        ,'+@TableKeys+'
                        ,''' + @ColumnName + '''
                    ,LEFT(' + @ColumnName + ', 3630) 
                    FROM ' + @TableName + ' (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                --Print @SQL -- *** DEBUG LINE ***
                INSERT INTO #Results
                    Exec (@SQL)
            END -- IF ColumnName
        END -- While Table and Column
    END --While Table
    
    SELECT TableName, KeyValues, ColumnName, ColumnValue FROM #Results
    END
    

提交回复
热议问题