给大家共享好东西喽! 查找数据库中指定字符串,支持2005以上

本文介绍了一个用于在数据库中查找指定字符串的SQL存储过程,支持模糊查询和对象范围查找,提供了详细的参数说明和使用示例。
--给大家共享好东西喽! 查找数据库中指定字符串
USE master 
GO
IF object_id('[dbo].[sp_get_char]','P') IS NOT NULL
DROP PROC [dbo].[sp_get_char]
go 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
CREATE       PROCEDURE [dbo].[sp_get_char]
    (
      @char VARCHAR(1024) ,
      @table_name NVARCHAR(255) = '' ,
      @type INT = 1     
    )
AS /*    作者:陈恩辉-弘恩
调用示例说明,参数为默认为1,返回时生成具体列定位;参数为2时,可快速返回定位到表
 
全库查找,返回最详细信息;
exec [dbo].[sp_get_char] '要寻找的字符' 
 
指定对象范围后,进行查找 
exec [dbo].[sp_get_char] '282','%USER%'
 
指定对象范围后,进行查找 ,进行最快返回
exec [dbo].[sp_get_char] '刘亚莎15','%USER_a%404',1 
*/    
     
    IF ( @char IS NULL
         OR RTRIM(@char) = ''
       ) 
        BEGIN    
            SELECT  '请正确输入您要寻找的字符' AS message_return     
            RETURN    
        END
    IF ( @type NOT IN ( 1, 2 ) ) 
        BEGIN    
            SELECT  '输入参数错误,参数只能是1或2' AS message_return     
            RETURN    
        END      
    IF @table_name <> ''
    BEGIN      
        IF NOT EXISTS ( SELECT  1
                        FROM    sys.objects o
                        WHERE   type = 'U'
                                AND name LIKE ISNULL(@table_name, '') + '%' ) 
            BEGIN
                SELECT  '您输入的对象名不存在' AS message_return 
                RETURN
            END
    END
    DECLARE --@char NVARCHAR(255) ,    
        @table_count INT ,
        @i INT ,
        @schema NVARCHAR(255) ,
        @table NVARCHAR(255) ,
        @col NVARCHAR(255) ,
        @sql_exec_table NVARCHAR(MAX) ,
        @sql_all_col NVARCHAR(MAX) ,
        @sql_exec1 NVARCHAR(MAX)      
    SET @i = 1 ;    
    SELECT  @table_count = COUNT(*)
    FROM    sys.objects
    WHERE   type = 'U'
            AND name LIKE @table_name + '%' ;    
     
     
    IF OBJECT_ID('tempdb..#getchar_tmp1') IS NOT NULL
        DROP TABLE #getchar_tmp1  
    CREATE TABLE #getchar_tmp1
        (schemaname NVARCHAR(255) ,
          tablename NVARCHAR(255) )    
     
   --select * from sys.schemas 
    DECLARE c_table CURSOR FAST_FORWARD 
    FOR
        SELECT  SCHEMA_NAME(s.schema_id) AS schemaname ,
                o.name AS tablename
        FROM    sys.objects AS o
        INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
        WHERE    o.type = 'U'
                  AND o.name LIKE @table_name + '%'
        ORDER BY schemaname ,
                tablename      
             
    OPEN c_table    
    FETCH NEXT FROM c_table INTO @schema, @table    

    WHILE @@FETCH_STATUS = 0 
        BEGIN 
            IF 'a' = 'A' ---- 不区分大小写时
                BEGIN  
                    SET @sql_exec_table = 'IF EXISTS ( SELECT * FROM '
                        + QUOTENAME(@schema) + '.' + QUOTENAME(@table)
                        + ' WITH (NOLOCK) WHERE 1 = 2 '   
                    SET @sql_all_col = (SELECT   ' OR ' + QUOTENAME(c.name) + ' LIKE ''' + @char + '%'''
										FROM    sys.columns c,sys.objects o 
										WHERE o.object_id = c.object_id 
												AND o.name =  @table AND o.type = 'U'
												AND ( (TYPE_NAME(c.system_type_id) LIKE '%char%' AND ( LEN(RTRIM(@char)) <= c.max_length OR c.max_length = -1))
													  OR TYPE_NAME(c.system_type_id) LIKE '%text%' )
										FOR XML PATH ('') )               
                END        
            IF 'a' <> 'A' ---- 区分大小写时
                BEGIN  
                    SET @sql_exec_table = 'IF EXISTS ( SELECT * FROM '
                        + QUOTENAME(@schema) + '.' + QUOTENAME(@table)
                        + ' WITH (NOLOCK) WHERE 1 = 2 '   
                    SET @sql_all_col = (SELECT   ' OR ' + QUOTENAME(c.name) + ' LIKE ''' + @char + '%'''
										FROM    sys.columns c,sys.objects o 
										WHERE o.object_id = c.object_id 
												AND o.name =  @table AND o.type = 'U'
												AND ( (TYPE_NAME(c.system_type_id) LIKE '%char%' AND ( LEN(RTRIM(@char)) <= c.max_length OR c.max_length = -1))
													  OR TYPE_NAME(c.system_type_id) LIKE '%text%' )
										FOR XML PATH ('') )               
                END                           
            SET @sql_all_col = @sql_all_col + ' )' + CHAR(13) + CHAR(10)
                + ' BEGIN ' + CHAR(13) + CHAR(10)
                + ' INSERT INTO #getchar_tmp1 ( schemaname , tablename )'
                + CHAR(13) + CHAR(10) + ' SELECT ''' + @schema + ''','''
                + @table + '''' + CHAR(13) + CHAR(10) + ' END '   
            SET @sql_exec1 = @sql_exec_table + @sql_all_col    
            PRINT CAST (@i AS NVARCHAR) + ' / '
                + CAST (@table_count AS NVARCHAR) + SPACE(10)
                + QUOTENAME(@schema) + '.' + QUOTENAME(@table)      
            SET @i = @i + 1
    
      
--如果有必要的话,可以将正在执行的内容打印出来    
--PRINT CAST (@i AS NVARCHAR) + ' / '+ CAST (@table_count AS NVARCHAR) + SPACE(10)+ QUOTENAME(@schema) + '.' + QUOTENAME(@table)      
--SET @i = @i + 1    
--PRINT ( @sql_exec1 )    
            BEGIN TRY 
                PRINT @sql_exec1
                EXEC sp_executesql @sql_exec1     
            END TRY 
            BEGIN CATCH 
                IF @@error <> 0 
                    PRINT ERROR_MESSAGE() + CHAR(13) + CHAR(10) + CHAR(13)
                        + @sql_exec1
            END CATCH 
            FETCH NEXT FROM c_table INTO @schema, @table    
        END    
    CLOSE c_table     
    DEALLOCATE c_table   
      SELECT  * FROM    #getchar_tmp1 
              
     
    IF NOT EXISTS ( SELECT  *
                    FROM    #getchar_tmp1 ) 
        BEGIN    
            SELECT  '没有发现你想要寻找的字符 ... ' AS msg     
            RETURN    
        END    
        
    IF EXISTS ( SELECT  *
                FROM    #getchar_tmp1 ) 
        BEGIN    
                    /* @type = 2 时,直接返回表*/  
            IF @type = 2 
                BEGIN    
                    SELECT  * ,
                            'SELECT * FROM ' + QUOTENAME(schemaname) + '.'
                            + QUOTENAME(tablename) AS sql_select
                    FROM    #getchar_tmp1     
                    DROP TABLE #getchar_tmp1    
                    RETURN    
                END
                    /* @type = 1 时,可以定位到具体是表中哪个字段,并且拼成*/        
            IF @type = 1 
                BEGIN 
                      /* 创建临时表 #getchar_tmp2 */   
                    CREATE TABLE #getchar_tmp2
                        (
                          [schema] NVARCHAR(255) ,
                          [table] NVARCHAR(255) ,
                          col NVARCHAR(255)
                        )     
     
                    DECLARE @s NVARCHAR(255) ,--架构名
                        @t NVARCHAR(255) ,--表名
                        @c NVARCHAR(255) ,--字段
                        @sql_exec_col NVARCHAR(MAX) 
                               /**声明游标列  c_col */   
                    DECLARE c_col CURSOR FAST_FORWARD
                    FOR
                        /** 搜索条件,只对字符列,或text列进行过滤 **/
                                SELECT  t.schemaname ,
                                        t.tablename ,
                                        c.name
                                FROM    #getchar_tmp1 t
                                INNER JOIN sys.objects o ON o.name = t.tablename
                                INNER JOIN sys.columns c ON ( o.object_id = c.object_id )
                                WHERE   ( ( TYPE_NAME(c.system_type_id) LIKE '%char%'
                                            AND ( DATALENGTH(RTRIM(@char)) <= c.max_length
                                                  OR c.max_length = -1))
                                          OR TYPE_NAME(c.system_type_id) LIKE '%text%')
                                        
                                         
                                                                 
     
     
                    OPEN c_col      
                    FETCH NEXT FROM c_col INTO @s, @t, @c     -- 架构  表名  列名
                    WHILE @@FETCH_STATUS = 0 
                        BEGIN 
                                /**拼接语句,如果某一列中包括这个字符,则写入临时表#getchar_tmp2 */   
                            SET @sql_exec_col = 'IF EXISTS (SELECT * FROM [' + @s + '].[' + @t + '] WITH (NOLOCK) WHERE '
                                + QUOTENAME(@c) + ' LIKE ''' + @char + '%'')' + CHAR(13) + CHAR(10)
                                + 'INSERT INTO #getchar_tmp2 ([schema],[table],[col]) '
                                + CHAR(13) + CHAR(10) + 'SELECT ''' + @s + ''',' + '''' + @t + ''',' + '''' + @c + ''''  
                                    /** 执行 @sql_exec_col */     
                                    --PRINT ( @sql_exec_col )    
                            EXEC sp_executesql  @sql_exec_col    
                          
                            FETCH NEXT FROM c_col INTO @s, @t, @c     -- 架构  表名  列名
     
                        END    
                    CLOSE c_col     
                    DEALLOCATE c_col ;     
 
                            /**生成返回数据**/
                    SELECT  [schema] ,
                            [table] AS table_name ,
                            [col] AS col_name ,
                            ' SELECT ' + QUOTENAME([col]) + ',* FROM '
                            + QUOTENAME([schema]) + '.' + QUOTENAME([table])
                            + ' WITH (NOLOCK) WHERE ' + QUOTENAME([col])
                            + ' LIKE ''' + @char + '%''' AS sql_select ,
                            '--UPDATE ' + QUOTENAME([schema]) + '.'
                            + QUOTENAME([table]) + ' SET ' + QUOTENAME([col])
                            + '= @new WHERE ' + QUOTENAME([col]) + ' LIKE '''
                            + @char + '%''' AS sql_update ,
                            '--DELETE FROM ' + QUOTENAME([schema]) + '.'
                            + QUOTENAME([table]) + ' WHERE ' + QUOTENAME([col])
                            + ' LIKE ''' + @char + '%''' AS sql_delete
                    FROM    #getchar_tmp2   
                    DROP TABLE #getchar_tmp2       
                END  
        END  
GO 
EXEC sp_MS_marksystemobject '[dbo].[sp_get_char]'


内容概要:本文围绕SecureCRT自动化脚本开发在毕业设计中的应用,系统介绍了如何利用SecureCRT的脚本功能(支持Python、VBScript等)提升计算机、网络工程等相关专业毕业设计的效率与质量。文章从关键概念入手,阐明了SecureCRT脚本的核心对象(如crt、Screen、Session)及其在解决多设备调试、重复操作、跨场景验证等毕业设计常见痛点中的价值。通过三个典型应用场景——网络设备配置一致性验证、嵌入式系统稳定性测试、云平台CLI兼容性测试,展示了脚本的实际赋能效果,并以Python实现的交换机端口安全配置验证脚本为例,深入解析了会话管理、屏幕同步、输出解析、异常处理和结果导出等关键技术细节。最后展望了低代码化、AI辅助调试和云边协同等未来发展趋势。; 适合人群:计算机、网络工程、物联网、云计算等相关专业,具备一定编程基础(尤其是Python)的本科或研究生毕业生,以及需要进行设备自动化操作的科研人员; 使用场景及目标:①实现批量网络设备配置的自动验证与报告生成;②长时间自动化采集嵌入式系统串口数据;③批量执行云平台CLI命令并分析兼容性差异;目标是提升毕业设计的操作效率、增强实验可复现性与数据严谨性; 阅读建议:建议读者结合自身毕业设计课题,参考文中代码案例进行本地实践,重点关注异常处理机制与正则表达式的适配,并注意敏感信息(如密码)的加密管理,同时可探索将脚本与外部工具(如Excel、数据库)集成以增强结果分析能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值