AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 99043
Accepted
HelloWorld1
HelloWorld1
Asked: 2015-04-29 04:38:27 +0800 CST2015-04-29 04:38:27 +0800 CST 2015-04-29 04:38:27 +0800 CST

在数据库中查找特定单词

  • 772

目标

在数据库中的表中找到特定的单词,并在列表中显示表和列的名称。

问题

有太多表无法在数据库中定位特定单词。

信息

  • 使用 SQL Server 2012
  • 每个表都使用“schemaname.tablename”
sql-server sql-server-2012
  • 2 2 个回答
  • 2417 Views

2 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2015-04-29T04:57:36+08:002015-04-29T04:57:36+08:00

    这不会很快(在我的本地 AdventureWorks 副本中生成 0 个结果需要一分钟多的时间)。

    DECLARE @SpecificWord NVARCHAR(32);
    SET @SpecificWord = N'donut';
    
    
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = N'SELECT NULL,NULL WHERE 1 = 0';
    SET @SpecificWord = N'%' + @SpecificWord + N'%';
    
    SELECT @sql += N' UNION ALL SELECT '''
     + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
     + ''',''' + QUOTENAME(c.name) + ''' WHERE EXISTS
     (
       SELECT 1 FROM ' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
         + N' WHERE ' + QUOTENAME(c.name) + N' LIKE @s
     )'
    FROM sys.columns AS c
    INNER JOIN sys.tables AS t
    ON c.[object_id] = t.[object_id]
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id]
    WHERE c.system_type_id IN (35,99,167,175,231,239);
    
    EXEC sys.sp_executesql @sql, N'@s NVARCHAR(32)', @SpecificWord;
    

    如果您出于某种原因需要支持sql_variant(我建议不要这样做),则只需要进行一些更改:

    DECLARE @SpecificWord NVARCHAR(32);
    SET @SpecificWord = N'donut';
    
    
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = N'SELECT NULL,NULL WHERE 1 = 0';
    SET @SpecificWord = N'%' + @SpecificWord + N'%';
    
    SELECT @sql += N' UNION ALL SELECT '''
     + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
     + ''',''' + QUOTENAME(c.name) + ''' WHERE EXISTS
     (SELECT 1 FROM ' + QUOTENAME(s.name) + N'.' 
     + QUOTENAME(t.name) + N' WHERE CONVERT(
       NVARCHAR(MAX), ' + QUOTENAME(c.name) 
     + N') LIKE @s)'
    FROM sys.columns AS c
    INNER JOIN sys.tables AS t
    ON c.[object_id] = t.[object_id]
    INNER JOIN sys.schemas AS s
    ON t.[schema_id] = s.[schema_id]
    WHERE c.system_type_id IN (35,98,99,167,175,231,239);
    
    EXEC sys.sp_executesql @sql, N'@s NVARCHAR(32)', @SpecificWord;
    
    • 9
  2. 3 revsuser126897
    2017-08-05T05:32:53+08:002017-08-05T05:32:53+08:00

    社区维基回答:

    您可以使用以下脚本,该脚本已用于查找不良数据。它可能并不快,但在我需要它的时候它已经在我的好几次中为我工作了:

    /*
    - Search through tables to find specific text
    - Written by Luis Chiriff (with help from SQL Server Central)
    - luis.chiriff@gmail.com @ 24/11/2008 @ 11:54
    */
    
    -- Variable Declaration
    
    Declare @StringToFind VARCHAR(200), @Schema sysname, @Table sysname, @FullTable int, @NewMinID int, @NewMaxID int,
    @SQLCommand VARCHAR(8000), @BaseSQLCommand varchar(8000), @Where VARCHAR(8000), @CountCheck varchar(8000) , @FieldTypes varchar(8000),
    @cursor VARCHAR(8000), @columnName sysname, @SCn int, @SCm int
    Declare @TableList table (Id int identity(1,1) not null, tablename varchar(250))
    Declare @SQLCmds table (id int identity(1,1) not null, sqlcmd varchar(8000))
    Declare @DataFoundInTables table (id int identity(1,1) not null, sqlcmd varchar(8000))
    
    
    -- Settings
    
    SET @StringToFind = 'territory'
    SET NOCOUNT ON
    SET @StringToFind = '%'+@StringToFind+'%'
    
    -- Gathering Info
    
    if ((select count(*) from sysobjects where name = 'tempcount') > 0)
        drop table tempcount
    
    create table tempcount (rowsfound int)
    insert into tempcount select 0
    
        -- This section here is to accomodate the user defined datatypes, if they have
        -- a SQL Collation then they are assumed to have text in them.
        SET @FieldTypes = ''
        select @FieldTypes = @FieldTypes + '''' + rtrim(ltrim(name))+''',' from systypes where collation is not null or xtype = 36
        select @FieldTypes = left(@FieldTypes,(len(@FieldTypes)-1))
    
    insert into @TableList (tablename) 
        select name from sysobjects 
        where xtype = 'U' and name not like 'dtproperties' 
        order by name
    
    -- Start Processing Table List
    
    select @NewMinID = min(id), @NewMaxID = max(id) from @TableList
    
    while(@NewMinID <= @NewMaxID)
        Begin
    
        SELECT @Table = tablename, @Schema='dbo', @Where = '' from @TableList where id = @NewMinID
    
        SET @SQLCommand = 'SELECT * FROM ' + @Table + ' WHERE' 
        -- removed ' + @Schema + '.
    
        SET @cursor = 'DECLARE col_cursor CURSOR FOR SELECT COLUMN_NAME
        FROM [' + DB_NAME() + '].INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_SCHEMA = ''' + @Schema + '''
        AND TABLE_NAME = ''' + @Table + '''
        AND DATA_TYPE IN ('+@FieldTypes+')'
        --Original Check, however the above implements user defined data types --AND DATA_TYPE IN (''char'',''nchar'',''ntext'',''nvarchar'',''text'',''varchar'')'
    
        EXEC (@cursor)
    
        SET @FullTable = 0
        DELETE FROM @SQLCmds
    
        OPEN col_cursor   
        FETCH NEXT FROM col_cursor INTO @columnName   
    
        WHILE @@FETCH_STATUS = 0   
        BEGIN   
    
            SET @Where = @Where + ' [' + @columnName + '] LIKE ''' + @StringToFind + ''''
            SET @Where = @Where + ' OR'
    
            --PRINT @Table + '|'+ cast(len(isnull(@Where,''))+len(isnull(@SQLCommand,'')) as varchar(10))+'|'+@Where
    
            if (len(isnull(@Where,''))+len(isnull(@SQLCommand,'')) > 3600)
                Begin
                    SELECT @Where = substring(@Where,1,len(@Where)-3)
                    insert into @SQLCmds (sqlcmd) select @Where
                    SET @Where = ''
                End
    
            FETCH NEXT FROM col_cursor INTO @columnName   
        END   
    
        CLOSE col_cursor   
        DEALLOCATE col_cursor 
    
        if (@Where <> '')
            Begin
                SELECT @Where = substring(@Where,1,len(@Where)-3)
                insert into @SQLCmds (sqlcmd) 
                    select @Where --select @Table,count(*) from @SQLCmds
            End
    
        SET @BaseSQLCommand = @SQLCommand
    
        select @SCn = min(id), @SCm = max(id) from @SQLCmds
        while(@SCn <= @SCm)
            Begin
    
            select @Where = sqlcmd from @SQLCmds where ID = @SCn
    
            if (@Where <> '')
                Begin
    
                SET @SQLCommand = @BaseSQLCommand + @Where
                SELECT @CountCheck = 'update tempcount set rowsfound = (select count(*) '+ substring(@SQLCommand,10,len(@SQLCommand)) + ')'
                EXEC (@CountCheck) 
    
                if ((select rowsfound from tempcount) > 0)
                        Begin
                            PRINT '--- ['+cast(@NewMinID as varchar(15))+'/'+cast(@NewMaxID as varchar(15))+'] '+@Table + ' ----------------------------------[FOUND!]'
                            --PRINT '--- [FOUND USING:] ' +@SQLCommand
                            insert into @DataFoundInTables (sqlcmd) select @SQLCommand
                            EXEC (@SQLCommand) 
                            update tempcount set rowsfound = 0
                        End
                else
                        Begin
                            PRINT '--- ['+cast(@NewMinID as varchar(15))+'/'+cast(@NewMaxID as varchar(15))+'] '+@Table
                        End
                End
    
            SET @SCn = @SCn + 1
            End
    
        set @NewMinID = @NewMinID + 1
        end
    
    if ((select count(*) from sysobjects where name = 'tempcount') > 0)
        drop table tempcount
    
    /*
    
    This will now return all the sql commands you need to use
    
    */
    
    
    select @NewMinID = min(id), @NewMaxID = max(id) from @DataFoundInTables
    
    if (@NewMaxID > 0)
        Begin
        PRINT ' '   
        PRINT ' '   
        PRINT '-----------------------------------------'
        PRINT '----------- TABLES WITH DATA ------------'
        PRINT '-----------------------------------------'
        PRINT ' '   
        PRINT 'We found ' + cast(@NewMaxID as varchar(10)) + ' table(s) with the string '+@StringToFind
        PRINT ' '
    
        while(@NewMinID <= @NewMaxID)
            Begin
    
            select @SQLCommand = sqlcmd from @DataFoundInTables where ID = @NewMinID
    
            PRINT @SQLCommand
    
            SET @NewMinID = @NewMinID + 1
            End
    
        PRINT ' '   
        PRINT '-----------------------------------------'
    
        End
    
    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve