How do I search an SQL Server database for a string?

后端 未结 15 1730
执念已碎
执念已碎 2020-11-28 18:40

I know it\'s possible, but I don\'t know how.

I need to search an SQL Server database for all mentions of a specific string.

For example: I would like t

15条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-28 19:08

    Here is the same script as submitted by user l--''''''---------'''''''''''', but corrected to work on a case-sensitive SQL instance, and with some other minor improvements.

    DROP PROCEDURE IF EXISTS dbo.spFind_Text_In_Database
    GO
    
    CREATE PROCEDURE dbo.spFind_Text_In_Database
        @strText_To_Find NVARCHAR(4000),
        @bitExact_Match BIT = 0
    AS
    SET NOCOUNT ON
    
    DECLARE @Temp TABLE(RowId INT IDENTITY(1,1), SchemaName sysname, TableName sysname, ColumnName SysName, DataType VARCHAR(100), DataFound BIT)
    
        INSERT  INTO @Temp(TableName,SchemaName, ColumnName, DataType)
        SELECT  C.TABLE_NAME, C.TABLE_SCHEMA, C.COLUMN_NAME, C.DATA_TYPE
        FROM    INFORMATION_SCHEMA.COLUMNS AS C
                INNER Join INFORMATION_SCHEMA.TABLES AS T
                    ON C.TABLE_NAME = T.TABLE_NAME
            AND C.TABLE_SCHEMA = T.TABLE_SCHEMA
        WHERE   TABLE_TYPE = 'BASE TABLE'
                And DATA_TYPE In ('ntext','text','nvarchar','nchar','varchar','char')
    
    
    DECLARE @i INT
    DECLARE @MAX INT
    DECLARE @TableName sysname
    DECLARE @ColumnName sysname
    DECLARE @SchemaName sysname
    DECLARE @SQL NVARCHAR(4000)
    DECLARE @PARAMETERS NVARCHAR(4000)
    DECLARE @DataExists BIT
    DECLARE @SQLTemplate NVARCHAR(4000)
    
    SELECT  @SQLTemplate = CASE WHEN @bitExact_Match = 1
                                THEN 'If Exists(Select *
                                              From   ReplaceTableName
                                              Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                           = ''' + @strText_To_Find + '''
                                              )
                                         Set @DataExists = 1
                                     Else
                                         Set @DataExists = 0'
                                ELSE 'If Exists(Select *
                                              From   ReplaceTableName
                                              Where  Convert(nVarChar(4000), [ReplaceColumnName])
                                                           Like ''%' + @strText_To_Find + '%''
                                              )
                                         Set @DataExists = 1
                                     Else
                                         Set @DataExists = 0'
                                END,
            @PARAMETERS = '@DataExists Bit OUTPUT',
            @i = 1
    
    SELECT @i = 1, @MAX = MAX(RowId)
    FROM   @Temp
    
    WHILE @i <= @MAX
        BEGIN
            SELECT  @SQL = REPLACE(REPLACE(@SQLTemplate, 'ReplaceTableName', QUOTENAME(SchemaName) + '.' + QUOTENAME(TableName)), 'ReplaceColumnName', ColumnName)
            FROM    @Temp
            WHERE   RowId = @i
    
    
            PRINT @SQL
            EXEC sp_executesql @SQL, @PARAMETERS, @DataExists = @DataExists OUTPUT
    
            IF @DataExists =1
                UPDATE @Temp SET DataFound = 1 WHERE RowId = @i
    
            SET @i = @i + 1
        END
    
    SELECT  SchemaName,TableName, ColumnName
    FROM    @Temp
    WHERE   DataFound = 1
    GO
    

提交回复
热议问题