Find a value anywhere in a database

前端 未结 18 887
小蘑菇
小蘑菇 2020-11-22 03:52

Given a #, how do I discover in what table and column it could be found within?

I don\'t care if it\'s fast, it just needs to work.

18条回答
  •  长情又很酷
    2020-11-22 04:07

    -- exec pSearchAllTables 'M54*'
    
    ALTER PROC pSearchAllTables (@SearchStr NVARCHAR(100))
    AS
    BEGIN
        -- A procedure to search all tables in a database for a value
        -- Note: Use * or % for wildcard
    
        DECLARE 
            @Results TABLE([Schema.Table.ColumnName] NVARCHAR(370), ColumnValue NVARCHAR(3630))
    
        SET NOCOUNT ON
    
        DECLARE 
            @TableName NVARCHAR(256) = ''
            , @ColumnName NVARCHAR(128)     
            , @SearchStr2 NVARCHAR(110) = QUOTENAME(REPLACE(@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 
            [Schema.Table.ColumnName]
            , ColumnValue 
        FROM @Results
        GROUP BY 
            [Schema.Table.ColumnName]
            , ColumnValue 
    
    END
    

提交回复
热议问题