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

  • 相关阅读:
    Android实现通过浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据(转)
    保存图片文件到本地
    android ScrollView中嵌套GridView,ListView只显示一行的解决办法
    蒙版提示页(添加新功能后的一种提示)
    C和指针 第三章--数据
    *(ptr++) += 123
    优先级队列-堆
    单链表相关(一)
    字符间的距离-动态规划
    和最大的连续子数组
  • 原文地址:https://www.cnblogs.com/awpatp/p/1694170.html
Copyright © 2011-2022 走看看