如何通过搜索 SQL 服务器中的所有表来查找任何数据类型的值

How Find a value as any Data Type by searching all tables in SQL Server

我正在使用 SQL 服务器 我想在我的查询中的任何地方进行搜索

例如: 我想在整个数据库中搜索这个“123”值

不仅搜索字符串还搜索数字:'123' 和 123 根据其类型为每一列

请指导我

您可以试试下面的查询。我已经尝试过并发现效果非常好。

DECLARE @SearchStr nvarchar(100)
SET @SearchStr = '201902'
 
 
    -- 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
        )
 
        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

我在下面找到了这个 link。您还将找到一个存储过程来执行此操作。 https://thesitedoctor.co.uk/blog/search-every-table-and-field-in-a-sql-server-database-updated/

这是另一种方法。它只是循环所有必需的表列组合和 returns 匹配的结果。

-- creating a temp table to fetch all tables in scope
drop table if exists #TMP_TABLE ;
create table #TMP_TABLE (
    PK INT IDENTITY,
    TABLE_NAME varchar(500),
    COLUMN_NAME varchar(500),
    IS_EXIST bit
)


INSERT INTO #TMP_TABLE (TABLE_NAME,COLUMN_NAME)
SELECT C.TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE -- C.TABLE_NAME = <your-tables> AND 
    C.DATA_TYPE in( 'varchar', 'int'); -- modify it to handle data types at once.

declare @MINID int, @MAXID int, @TABLE_NAME varchar(500), @COLUMN_NAME varchar(500), @sqlString varchar(max);
-- setting boundaries for the while loop
SET @MINID = (SELECT ISNULL(MIN(PK),0) FROM #TMP_TABLE ); 
SET @MAXID = (SELECT ISNULL(MAX(PK),0) FROM #TMP_TABLE );

-- looping all the table-columns in scope
WHILE ((@MINID<=@MAXID) AND (@MINID<>0))
BEGIN
    SELECT @TABLE_NAME = TABLE_NAME,@COLUMN_NAME =  COLUMN_NAME
    FROM  #TMP_TABLE 
    WHERE PK = @MINID;

    SET @sqlString =  'UPDATE #TMP_TABLE 
                    SET IS_EXIST = 1 
                    WHERE EXISTS (SELECT 1 
                        FROM '+ @TABLE_NAME+' 
                        WHERE  '+ @COLUMN_NAME +' = ''<YOUR-SEARCH-STRING>'') 
                        AND PK = '+ CAST(@MINID AS varchar(10));
    EXEC(@sqlString) ;
    SET @MINID = (SELECT MIN(PK) FROM #TMP_TABLE WHERE PK > @MINID );
END 

SELECT * FROM #TMP_TABLE WHERE IS_EXIST = 1 ; -- will give you matched results.