zoukankan      html  css  js  c++  java
  • 如何在某一数据库的所有表的所有列上搜索一个字符串?

    背景:

    研究SharePoint产品和技术, 对SharePoint使用的数据库的研究是很有必要的. 研究的时候需要在数据库中寻找某一个值, 找到这个值以后就可以帮助我们理解数据是如何存储的.

    所以就会有这样的需求, 如何才能在一个数据库的范围内, 包括所有的表, 所有的列, 上寻找某一个字符串呢?

    下面的存储过程可以帮助你完成这样的功能.

    使用方法:

    exec SearchAllTables '%Approved%'
    go

    存储过程源码:

    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
    
    
        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
            )
    
            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 ColumnName, ColumnValue FROM #Results
    END
    
    

    抽时间做一个可以搜索GUID版本的就更强大了. 呵呵.

    ===========================================

    2010/6/29日更新

    ===========================================

    可以搜索GUID的版本已经做好了. 代码如下:

    USE [YOUR_DATABASE_NAME]
    GO
    /****** Object:  StoredProcedure [dbo].[SearchGuid]    Script Date: 06/03/2010 10:32:43 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE PROCEDURE [dbo].[SearchGuid]
    (
          @SearchStr uniqueidentifier
    )
    AS
    BEGIN
    
          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 = @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 ('uniqueidentifier')
                                  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
    END
    

    ===========================================

    2010/10/04日更新

    ===========================================

    正如你所知, SharePoint的数据库是不允许进行任何修改的, KB 841057.

    生产环境上, 你可以使用下面的语句簇来进行搜索, 这种方法可以避免创建存储过程.

    搜索字符串

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    DECLARE @SearchStr nvarchar(110)      
    SET @SearchStr = 'MyKeyWord'
    
    BEGIN
        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
            )
    
            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 ColumnName, ColumnValue FROM #Results
        Drop Table #Results
    END
    
    
    

    搜索GUID

    --Search GUID in all SQL tables without using Stored Procedure
    --Replace the '00bfea71-1c5e-4a24-b310-ba51c3eb7a57' with your own keyword
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    Declare  @SearchStr uniqueidentifier
    Set @SearchStr = '00bfea71-1c5e-4a24-b310-ba51c3eb7a57'
    
    BEGIN
    
          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 = @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 ('uniqueidentifier')
                                  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

    ===========================================

    2014/09/12日更新

    ===========================================

    搜索ntext

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    DECLARE @SearchStr nvarchar(110)      
    SET @SearchStr = '020032000060001440000000103037287cbeed0a5a496e76697374'
    
    BEGIN
        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
            )
    
            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 ('ntext')
                        AND    QUOTENAME(COLUMN_NAME) > @ColumnName
                )
    
                IF @ColumnName IS NOT NULL
                BEGIN
                    INSERT INTO #Results
                    EXEC
                    (
                        'SELECT ''' + @TableName + '.' + @ColumnName + ''', SUBSTRING(' + @ColumnName + ',1, 3630) 
                        FROM ' + @TableName + ' (NOLOCK) ' +
                        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                    )
                END
            END    
        END
        SELECT ColumnName, ColumnValue FROM #Results
        Drop Table #Results
    END
    

    摘自

    How to search all columns of all tables in a database for a keyword?

    http://vyaskn.tripod.com/search_all_columns_in_all_tables.htm

  • 相关阅读:
    A1023 Have Fun with Numbers (20分)(大整数四则运算)
    A1096 Consecutive Factors (20分)(质数分解)
    A1078 Hashing (25分)(哈希表、平方探测法)
    A1015 Reversible Primes (20分)(素数判断,进制转换)
    A1081 Rational Sum (20分)
    A1088 Rational Arithmetic (20分)
    A1049 Counting Ones (30分)
    A1008 Elevator (20分)
    A1059 Prime Factors (25分)
    A1155 Heap Paths (30分)
  • 原文地址:https://www.cnblogs.com/awpatp/p/1694170.html
Copyright © 2011-2022 走看看