SQL搜索所有表

时间:2014-11-21 00:25:47

标签: sql sql-server stored-procedures

我一直在使用这个SQL脚本来搜索数据库中每个表的每个字段以获取特定值。

但它似乎不适用于数字字段。 (因此,如果我将121放入搜索中,并且有一个字段为十进制字段,其中包含121.000或121,则不会提供结果)

这有点超出我修改此脚本的SQL技能,所以我希望有人可以提供帮助。

这不适用于生产用途。但它一直是偶尔使用的有用工具。

DECLARE  @Tablenames VARCHAR(500)
DECLARE @SearchStr NVARCHAR(60)
DECLARE @GenerateSQLOnly Bit 

SELECT @Tablenames =''
SELECT @SearchStr  ='16'
SELECT @GenerateSQLOnly = 0

/*
    Variables and usage

    @Tablenames     -- Provide a single table name or multiple table name with comma seperated. 
                        If left blank , it will check for all the tables in the database
    @SearchStr      -- Provide the search string. Use the '%' to coin the search. 
                        EX : X%--- will give data staring with X
                             %X--- will give data ending with X
                             %X%--- will give data containig  X
    @GenerateSQLOnly -- Provide 1 if you only want to generate the SQL statements without seraching the database. 
                        By default it is 0 and it will search.

    Samples :

    1. To search data in a table

                 @Tablenames = 'T1'
                ,@SearchStr  = '%TEST%'

        The above sample searches in table T1 with string containing TEST.

    2. To search in a multiple table

                 @Tablenames = 'T2'
                ,@SearchStr  = '%TEST%'

        The above sample searches in tables T1 & T2 with string containing TEST.

    3. To search in a all table

                 @Tablenames = '%'
                ,@SearchStr  = '%TEST%'

        The above sample searches in all table with string containing TEST.

    4. Generate the SQL for the Select statements

                 @Tablenames        = 'T1'
                ,@SearchStr     = '%TEST%'
                ,@GenerateSQLOnly   = 1

*/

    SET NOCOUNT ON

    DECLARE @CheckTableNames Table
    (
    Tablename sysname
    )

    DECLARE @SQLTbl TABLE
    (
     Tablename      SYSNAME
    ,WHEREClause    VARCHAR(MAX)
    ,SQLStatement   VARCHAR(MAX)
    ,Execstatus     BIT 
    )

    DECLARE @sql VARCHAR(MAX)
    DECLARE @tmpTblname sysname

    IF LTRIM(RTRIM(@Tablenames)) IN ('' ,'%')
    BEGIN

        INSERT INTO @CheckTableNames
        SELECT Name
          FROM sys.tables
    END
    ELSE
    BEGIN

        SELECT @sql = 'SELECT ''' + REPLACE(@Tablenames,',',''' UNION SELECT ''') + ''''

        INSERT INTO @CheckTableNames
        EXEC(@sql)

    END

    INSERT INTO @SQLTbl
    ( Tablename,WHEREClause)
    SELECT SCh.name + '.' + ST.NAME,
            (
                SELECT '[' + SC.name + ']' + ' LIKE ''' + @SearchStr + ''' OR ' + CHAR(10)
                  FROM SYS.columns SC
                  JOIN SYS.types STy
                    ON STy.system_type_id = SC.system_type_id
                   AND STy.user_type_id =SC.user_type_id
                 WHERE STY.name in ('varchar','char','nvarchar','nchar')
                   AND SC.object_id = ST.object_id
                 ORDER BY SC.name
                FOR XML PATH('')
            )
      FROM  SYS.tables ST
      JOIN @CheckTableNames chktbls
                ON chktbls.Tablename = ST.name 
      JOIN SYS.schemas SCh
        ON ST.schema_id = SCh.schema_id
     WHERE ST.name <> 'SearchTMP'
      GROUP BY ST.object_id, SCh.name + '.' + ST.NAME ;

      UPDATE @SQLTbl
         SET SQLStatement = 'SELECT * INTO SearchTMP FROM ' + Tablename + ' WHERE ' + substring(WHEREClause,1,len(WHEREClause)-5)

      DELETE FROM @SQLTbl
       WHERE WHEREClause IS NULL

    WHILE EXISTS (SELECT 1 FROM @SQLTbl WHERE ISNULL(Execstatus ,0) = 0)
    BEGIN

        SELECT TOP 1 @tmpTblname = Tablename , @sql = SQLStatement
          FROM @SQLTbl 
         WHERE ISNULL(Execstatus ,0) = 0

         IF @GenerateSQLOnly = 0
         BEGIN

            IF OBJECT_ID('SearchTMP','U') IS NOT NULL
                DROP TABLE SearchTMP
            EXEC (@SQL)

            IF EXISTS(SELECT 1 FROM SearchTMP)
            BEGIN
                SELECT Tablename=@tmpTblname,* FROM SearchTMP
            END

         END
         ELSE
         BEGIN
             PRINT REPLICATE('-',100)
             PRINT @tmpTblname
             PRINT REPLICATE('-',100)
             PRINT replace(@sql,'INTO SearchTMP','')
         END

         UPDATE @SQLTbl
            SET Execstatus = 1
          WHERE Tablename = @tmpTblname

    END

    SET NOCOUNT OFF

go

1 个答案:

答案 0 :(得分:0)

您是否也要包含所有数字字段?如果是这种情况,请删除由varchar,char,nvarchar和nchar过滤的where子句。

 SELECT '[' + SC.name + ']' + ' LIKE ''' + @SearchStr + ''' OR ' + CHAR(10)
              FROM SYS.columns SC
              JOIN SYS.types STy
                ON STy.system_type_id = SC.system_type_id
               AND STy.user_type_id =SC.user_type_id
            -- WHERE STY.name in ('varchar','char','nvarchar','nchar')
               AND SC.object_id = ST.object_id
             ORDER BY SC.name
            FOR XML PATH('')
相关问题