2016-03-08 2 views

ответ

2

Я использовал процедуру с here для выполнения таких поисков:

CREATE PROCEDURE 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 
    -- Updated and tested by Tim Gaunt 
    -- http://www.thesitedoctor.co.uk 
    -- http://blogs.thesitedoctor.co.uk/tim/2010/02/19/Search+Every+Table+And+Field+In+A+SQL+Server+Database+Updated.aspx 
    -- Tested on: SQL Server 7.0, SQL Server 2000, SQL Server 2005 and SQL Server 2010 
    -- Date modified: 03rd March 2011 19:00 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 
     ) 

     PRINT 'Search within table ' + @TableName 

     -- add exceptions here 
     IF (@TableName LIKE '%AUDIT%') 
     BEGIN 
      PRINT 'Skipped!' 

      CONTINUE 
     END 

     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', 'int', 'decimal') 
        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 ColumnName, ColumnValue FROM #Results 
    DROP TABLE #Results 
END 
GO 

-- sample search 
EXEC SearchAllTables N'Hedge' 

Однако, будьте осторожны с этим видом поиска, поскольку они очень ресурсоемким. Моя настройка - это не поиск в некоторых известных аудиторских таблицах, поскольку они были огромными, и поиск был очень медленным.

Смежные вопросы