【问题标题】:Find a string by searching all tables in SQL Server通过搜索 SQL Server 中的所有表来查找字符串
【发布时间】:2013-03-23 08:14:09
【问题描述】:

有没有什么办法可以在SQL Server的一个数据库的所有表中搜索一个字符串?

我想搜索字符串john。结果应显示包含john 的表及其各自的行。

【问题讨论】:

标签: sql sql-server search


【解决方案1】:

如果你和我一样,在生产环境中有一定的限制,你可能希望使用表变量而不是临时表,使用即席查询而不是创建过程。

当然取决于你的sql server实例,它必须支持表变量。

我还添加了一个 USE 语句来缩小搜索范围

USE DATABASE_NAME
DECLARE @SearchStr nvarchar(100) = 'SEARCH_TEXT'
DECLARE @Results TABLE (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', '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

【讨论】:

  • 太棒了。我添加了“PRINT @TableName + '。” + @ColumnName" 在第 53 行,所以我可以在它通过我的大型数据库工作时获得一些状态。但这很有帮助。
  • 谢谢!搜索旧ACT! CRM 数据库更简单,屏幕上的字段是“Company reg”,数据库字段是“tickersymbol”,但结果太糟糕了!大声笑
  • 如何获取具有结果的primaryKeys?任何帮助
  • 如果我每次来这里复制这个强大的查询时都可以投票,那么您的分数很容易翻倍:D
  • ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 'DECLARE @SearchStr nvarchar(100) = 'SEARCH_TEXT' 附近使用正确的语法
【解决方案2】:

有点晚,但希望有用。

为什么不尝试一些可以集成到 SSMS 中的第三方工具。

我曾使用ApexSQL Search(100% 免费)在架构和数据搜索方面取得了良好的成功,还有具有此功能的SSMS tools pack(对于 SQL 2012 来说不是免费的,但相当实惠)。

上面的存储过程真的很棒;只是在我看来这更方便。此外,如果您想搜索日期时间列或 GUID 列等,则需要稍作修改……

【讨论】:

  • Apex SQL Search 自 2021 年起不再免费。
【解决方案3】:

要更新TechDo 对 SQL server 2012 的回答。您需要更改:'FROM ' + @TableName + ' (NOLOCK) ' to FROM ' + @TableName + 'WITH (NOLOCK) ' +

否则你会得到以下错误:Deprecated feature 'Table hint without WITH' is not supported in this version of SQL Server.

下面是完整的更新存储过程:

CREATE PROC SearchAllTables
(
@SearchStr nvarchar(100)
)
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 = 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', '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 + 'WITH (NOLOCK) ' +
                    ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                )
            END
        END    
    END

    SELECT ColumnName, ColumnValue FROM #Results
END

【讨论】:

  • 这东西怎么称呼?
【解决方案4】:

有点晚了,但是你可以很容易地用这个查询找到一个字符串

DECLARE
@search_string  VARCHAR(100),
@table_name     SYSNAME,
@table_id       INT,
@column_name    SYSNAME,
@sql_string     VARCHAR(2000)

SET @search_string = 'StringtoSearch'

DECLARE tables_cur CURSOR FOR SELECT ss.name +'.'+ so.name [name], object_id FROM sys.objects so INNER JOIN sys.schemas ss ON so.schema_id = ss.schema_id WHERE  type = 'U'

OPEN tables_cur

FETCH NEXT FROM tables_cur INTO @table_name, @table_id

WHILE (@@FETCH_STATUS = 0)
BEGIN
    DECLARE columns_cur CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @table_id 
        AND system_type_id IN (167, 175, 231, 239)

    OPEN columns_cur

    FETCH NEXT FROM columns_cur INTO @column_name
        WHILE (@@FETCH_STATUS = 0)
        BEGIN
            SET @sql_string = 'IF EXISTS (SELECT * FROM ' + @table_name + ' WHERE [' + @column_name + '] 
            LIKE ''%' + @search_string + '%'') PRINT ''' + @table_name + ', ' + @column_name + ''''

            EXECUTE(@sql_string)

        FETCH NEXT FROM columns_cur INTO @column_name
        END

    CLOSE columns_cur

DEALLOCATE columns_cur

FETCH NEXT FROM tables_cur INTO @table_name, @table_id
END

CLOSE tables_cur
DEALLOCATE tables_cur

【讨论】:

  • 当表的架构不是“dbo”时,此脚本将失败,不幸的是,be DB 中的大多数表都有不同的架构。适用于几个“dbo”的。
  • 刚刚在 schemas 表上将初始光标编辑为 INNER JOIN,所以现在它在使用它时确实在表名中包含了 schema。
  • 我还在 system_types 列表中添加了 99 (ntext) 以进行搜索,因为目前它忽略了所有 xml 字段。 ` AND system_type_id IN (167, 175, 231, 239, 99)`
【解决方案5】:

不需要嵌套循环(外部循环遍历表格,内部循环遍历所有表格列)。可以从INFORMATION_SCHEMA.COLUMNS 中检索所有(或任意选择/过滤的)表列组合,并在一个循环中简单地通过(搜索)所有这些组合:

DECLARE @search VARCHAR(100), @table SYSNAME, @column SYSNAME

DECLARE curTabCol CURSOR FOR
    SELECT c.TABLE_SCHEMA + '.' + c.TABLE_NAME, c.COLUMN_NAME
    FROM INFORMATION_SCHEMA.COLUMNS c
    JOIN INFORMATION_SCHEMA.TABLES t 
      ON t.TABLE_NAME=c.TABLE_NAME AND t.TABLE_TYPE='BASE TABLE' -- avoid views
    WHERE c.DATA_TYPE IN ('varchar','nvarchar') -- searching only in these column types
    --AND c.COLUMN_NAME IN ('NAME','DESCRIPTION') -- searching only in these column names

SET @search='john'

OPEN curTabCol
FETCH NEXT FROM curTabCol INTO @table, @column

WHILE (@@FETCH_STATUS = 0)
BEGIN
    EXECUTE('IF EXISTS 
             (SELECT * FROM ' + @table + ' WHERE ' + @column + ' = ''' + @search + ''') 
             PRINT ''' + @table + '.' + @column + '''')
    FETCH NEXT FROM curTabCol INTO @table, @column
END

CLOSE curTabCol
DEALLOCATE curTabCol

【讨论】:

    【解决方案6】:

    我为此编写了一个SP,它以表名的形式返回搜索结果,在其中找到搜索关键字字符串的列名以及搜索相应的行,如下面的屏幕截图所示。

    这可能不是最有效的解决方案,但您可以随时根据需要进行修改和使用。

    IF OBJECT_ID('sp_KeywordSearch', 'P') IS NOT NULL
        DROP PROC sp_KeywordSearch
    GO
    
    CREATE PROCEDURE sp_KeywordSearch @KeyWord NVARCHAR(100)
    AS
    BEGIN
        DECLARE @Result TABLE
            (TableName NVARCHAR(300),
             ColumnName NVARCHAR(MAX))
    
        DECLARE @Sql NVARCHAR(MAX),
            @TableName NVARCHAR(300),
            @ColumnName NVARCHAR(300),
            @Count INT
    
        DECLARE @tableCursor CURSOR
    
        SET @tableCursor = CURSOR LOCAL SCROLL FOR
        SELECT  N'SELECT @Count = COUNT(1) FROM [dbo].[' + T.TABLE_NAME + '] WITH (NOLOCK) WHERE CAST([' + C.COLUMN_NAME +
                '] AS NVARCHAR(MAX)) LIKE ''%' + @KeyWord + N'%''',
                T.TABLE_NAME,
                C.COLUMN_NAME
        FROM    INFORMATION_SCHEMA.TABLES AS T WITH (NOLOCK)
        INNER JOIN INFORMATION_SCHEMA.COLUMNS AS C WITH (NOLOCK)
        ON      T.TABLE_SCHEMA = C.TABLE_SCHEMA AND
                T.TABLE_NAME = C.TABLE_NAME
        WHERE   T.TABLE_TYPE = 'BASE TABLE' AND
                C.TABLE_SCHEMA = 'dbo' AND
                C.DATA_TYPE NOT IN ('image', 'timestamp')
    
        OPEN @tableCursor
        FETCH NEXT FROM @tableCursor INTO @Sql, @TableName, @ColumnName
    
        WHILE (@@FETCH_STATUS = 0)
        BEGIN
            SET @Count = 0
    
            EXEC sys.sp_executesql
                @Sql,
                N'@Count INT OUTPUT',
                @Count OUTPUT
    
            IF @Count > 0
            BEGIN
                INSERT  INTO @Result
                        (TableName, ColumnName)
                VALUES  (@TableName, @ColumnName)
            END
    
            FETCH NEXT FROM @tableCursor INTO @Sql, @TableName, @ColumnName
        END
    
        CLOSE @tableCursor
        DEALLOCATE @tableCursor
    
        SET @tableCursor = CURSOR LOCAL SCROLL FOR
        SELECT  SUBSTRING(TB.Sql, 1, LEN(TB.Sql) - 3) AS Sql, TB.TableName, SUBSTRING(TB.Columns, 1, LEN(TB.Columns) - 1) AS Columns
        FROM    (SELECT R.TableName, (SELECT R2.ColumnName + ', ' FROM @Result AS R2 WHERE R.TableName = R2.TableName FOR XML PATH('')) AS Columns,
                        'SELECT * FROM ' + R.TableName + ' WITH (NOLOCK) WHERE ' +
                        (SELECT 'CAST(' + R2.ColumnName + ' AS NVARCHAR(MAX)) LIKE ''%' + @KeyWord + '%'' OR '
                         FROM   @Result AS R2
                         WHERE  R.TableName = R2.TableName
                        FOR
                         XML PATH('')) AS Sql
                 FROM   @Result AS R
                 GROUP BY R.TableName) TB
        ORDER BY TB.Sql
    
        OPEN @tableCursor
        FETCH NEXT FROM @tableCursor INTO @Sql, @TableName, @ColumnName
    
        WHILE (@@FETCH_STATUS = 0)
        BEGIN
            PRINT @Sql
            SELECT  @TableName AS [Table],
                    @ColumnName AS Columns
            EXEC(@Sql)
    
            FETCH NEXT FROM @tableCursor INTO @Sql, @TableName, @ColumnName
        END
    
        CLOSE @tableCursor
        DEALLOCATE @tableCursor
    
    END
    

    【讨论】:

    • 在哪里定义我们的搜索字符串?
    【解决方案7】:

    这很有帮助。我想将此函数导入 Postgre SQL 数据库。以为我会与任何有兴趣的人分享。将有他们几个小时。注意:此函数创建一个可以在 Postgre 数据库上复制和执行的 SQL 语句列表。也许比我更聪明的人可以让 Postgre 在一个函数中创建和执行语句。

    CREATE OR REPLACE FUNCTION SearchAllTables(_search text) RETURNS TABLE( txt text ) as $funct$
        DECLARE __COUNT int;
        __SQL text;
    BEGIN
        EXECUTE 'SELECT COUNT(0) FROM INFORMATION_SCHEMA.COLUMNS
                        WHERE    DATA_TYPE = ''text'' 
                        AND          table_schema = ''public'' ' INTO __COUNT;
    
        RETURN QUERY 
            SELECT CASE WHEN ROW_NUMBER() OVER (ORDER BY table_name) < __COUNT THEN 
                'SELECT ''' || table_name ||'.'|| column_name || ''' AS tbl, "'  || column_name || '" AS col FROM "public"."' || "table_name" || '" WHERE "'|| "column_name" || '" ILIKE ''%' || _search  || '%'' UNION ALL' 
                ELSE 
                'SELECT ''' || table_name ||'.'|| column_name || ''' AS tbl, "'  || column_name || '" AS col FROM "public"."' || "table_name" || '" WHERE "'|| "column_name" || '" ILIKE ''%' || _search  || '%'''
            END AS txt
    
                        FROM     INFORMATION_SCHEMA.COLUMNS
                        WHERE    DATA_TYPE = 'text' 
                        AND          table_schema = 'public';
    END
    $funct$ LANGUAGE plpgsql;
    

    【讨论】:

      【解决方案8】:

      这篇文章中提到的答案已经好几次了,我也采用了一点,因为我也只需要在一个表中搜索:

      (也让表名的输入更加简单)

      ALTER PROC dbo.db_compare_SearchAllTables_sp
      (
          @SearchStr nvarchar(100),
          @TableName nvarchar(256) = ''
      )
      AS
      BEGIN
              if PARSENAME(@TableName, 2) is null
                  set @TableName = 'dbo.' + QUOTENAME(@TableName, '"')
      
          declare @results TABLE(ColumnName nvarchar(370), ColumnValue nvarchar(3630))
      
          SET NOCOUNT ON
      
          DECLARE @ColumnName nvarchar(128) = '', @SearchStr2 nvarchar(110)
          SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
              IF @TableName <> ''
              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 + ' WITH (NOLOCK) ' +
                          ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                      )
                  END
              END    
              ELSE
          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 + ' WITH (NOLOCK) ' +
                          ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                      )
                  END
              END    
          END
      
          SELECT ColumnName, ColumnValue FROM @results
      END
      

      【讨论】:

        【解决方案9】:

        改进来自@Brandon 的惊人答案,我使用铸件将类型添加到 ntext 和 xml:

        BEGIN TRAN
        
        DECLARE @SearchStr nvarchar(100) = 'SEARCH_TEXT'
        DECLARE @Results TABLE (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', 'int', 'decimal', 'ntext', 'xml')
                        AND    QUOTENAME(COLUMN_NAME) > @ColumnName
                )
        
                IF @ColumnName IS NOT NULL
        
                BEGIN
                    INSERT INTO @Results
                    EXEC
                    (
                        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT((cast(' + @ColumnName + ' as nvarchar(max))), 3630) 
                        FROM ' + @TableName + ' (NOLOCK) ' +
                        ' WHERE (cast(' + @ColumnName + ' as nvarchar(max))) LIKE ' + @SearchStr2
                    )
                END
            END    
        END
        
        SELECT ColumnName, ColumnValue FROM @Results
        
        ROLLBACK
        
        

        【讨论】:

          【解决方案10】:
          [CREATE PROC SearchAllTables ( @SearchStr nvarchar(100) ) 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 = 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
              
              EXEC SearchAllTables 'Computer'][1]
          
          
            [1]: https://koukia.ca/search-for-a-string-in-all-tables-and-all-fields-of-a-database-with-tsql-b6f8a1bfda37
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-28
            • 2015-11-27
            • 2021-05-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-11
            • 2015-09-08
            相关资源
            最近更新 更多