• SQL Server中执行正则表达式


    总体方案:写function,再执行update语句。

    一、查询函数

    -- =============================================  
    -- Author:      <liudong>  
    -- Create date: <2012/11/06>  
    -- Description: <sql正则表达式>  
    -- =============================================  
    CREATE FUNCTION Reg   
    (    
        @pattern varchar(2000),    
        @matchstring varchar(8000)    
    )    
    returns int    
    as     
    begin    
        declare @objRegexExp int    
        declare @strErrorMessage varchar(255)    
        declare @hr int,@match bit    
        exec @hr= sp_OACreate 'VBScript.RegExp', @objRegexExp out    
        if @hr = 0     
            exec @hr= sp_OASetProperty @objRegexExp, 'Pattern', @pattern    
        if @hr = 0     
            exec @hr= sp_OASetProperty @objRegexExp, 'IgnoreCase', 1    
        if @hr = 0     
            exec @hr= sp_OAMethod @objRegexExp, 'Test', @match OUT, @matchstring    
        if @hr <>0     
        begin    
            return null    
        end    
        exec sp_OADestroy @objRegexExp    
        return @match    
    end  
    

      函数结果返回 1 ,验证成功。

    如果执行上面的函数报如下错误:
     
    SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问
    

     执行下面sql语句即可: 

    USE master    
    GO    
    sp_configure 'show advanced options', 1;    
    GO    
    RECONFIGURE;    
    GO    
    sp_configure 'Ole Automation Procedures', 1;    
    GO    
    RECONFIGURE;    
    GO    
    sp_configure 'Ad Hoc Distributed Queries', 1;    
    GO    
    RECONFIGURE;    
    GO    
    

     --查询配置信息  

    RECONFIGURE;    
    EXEC sp_configure; 
    

      

    测试语句(假如要查找Users表所有用户名为存英文的用户内):
    SELECT * FROM Users WHERE dbo.Reg('^[a-zA-Z]+$',UserName)=1 
    

      

     二、替换函数:得到替换后的字符串(这个函数令我发生了质量事故!)
    CREATE FUNCTION dbo.regexReplace (
    	@source ntext,
    	--原字符串 
    	@regexp VARCHAR (1000),
    	--正则表达式 
    	@replace VARCHAR (1000),
    	--替换值 
    	@globalReplace BIT = 1,
    	--是否是全局替换 
    	@ignoreCase BIT = 0 --是否忽略大小写 
    ) returnS VARCHAR (MAX) AS
    BEGIN
    
    DECLARE @hr INTEGER
    DECLARE @objRegExp INTEGER
    DECLARE @result VARCHAR (5000) EXEC @hr = sp_OACreate 'VBScript.RegExp',
     @objRegExp OUTPUT
    IF @hr <> 0
    BEGIN
    	EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
    END EXEC @hr = sp_OASetProperty @objRegExp,
     'Pattern',
     @regexp
    IF @hr <> 0
    BEGIN
    	EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
    END EXEC @hr = sp_OASetProperty @objRegExp,
     'Global',
     @globalReplace
    IF @hr <> 0
    BEGIN
    	EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
    END EXEC @hr = sp_OASetProperty @objRegExp,
     'IgnoreCase',
     @ignoreCase
    IF @hr <> 0
    BEGIN
    	EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
    END EXEC @hr = sp_OAMethod @objRegExp,
     'Replace',
     @result OUTPUT,
     @source,
     @replace
    IF @hr <> 0
    BEGIN
    	EXEC @hr = sp_OADestroy @objRegExp RETURN NULL
    END EXEC @hr = sp_OADestroy @objRegExp
    IF @hr <> 0
    BEGIN
    	RETURN NULL
    END RETURN @result
    END
    

     三、执行update

    update Merchandise set Content=dbo.regexReplace(Content,'<img.*?>','',1,1) where dbo.Reg('<img.*?>',Content)=1;
    

     【插播事故】哎呀误update了。一开始没加上where条件,执行完了才隐隐感觉不对劲,没去细想,就干别的事情了。结果,领导跑过来说其他小问题的时候,发现了大问题!就是Content全部变为null了!悲剧。我亲手酿制了一次质量事故。

    于是从网上各种渠道搜索如何恢复数据,找到了几篇比较有意义的文章,但是因为我的恢复模式是简单的,不是完整的,所以没办法按文章所述的方法去恢复。但是还是要记录一下这些文章,给了我启迪。

    关于数据库恢复的参考:

    http://blog.csdn.net/dba_huangzj/article/details/8491327
    
    http://www.cnblogs.com/dudu/archive/2011/10/15/sql_server_recover_deleted_records.html

    最后找到三天前的备份,利用联合查询,恢复了部分数据,但是有部分数据因为没有事务日志,没有办法恢复了。

    跨数据库联合查询更新的脚本,记录一下:

    UPDATE a
       SET a.[Content] = b.[Content]
       from [目标库名].[dbo].[Merchandise] a
       left join [来源库名].[dbo].[Merchandise] b on a.MerchandiseID=b.MerchandiseID
     WHERE a.Content is null and a.editTime>'2015-08-01 00:00:00';
    GO

    关于SQL中的正则表达式参考:

    http://www.2cto.com/database/201211/166792.html
    
    http://www.cnblogs.com/simadi/p/4288466.html
    
    http://tool.oschina.net/regex
    
        
    

      

      
        
     
     
     
     
  • 相关阅读:
    Codeforces Round #299 (Div. 2) B. Tavas and SaDDas 水题
    Codeforces Round #299 (Div. 2) A. Tavas and Nafas 水题
    Codeforces Round #262 (Div. 2) E. Roland and Rose 暴力
    2015 UESTC 数据结构专题N题 秋实大哥搞算数 表达式求值/栈
    hdu 3340 Rain in ACStar 线段树区间等差数列更新
    hust 1385 islands 并查集+搜索
    2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集
    2015 UESTC 数据结构专题G题 秋实大哥去打工 单调栈
    2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
    2015 UESTC 数据结构专题D题 秋实大哥与战争 SET的妙用
  • 原文地址:https://www.cnblogs.com/luodengxiong/p/4794404.html
Copyright © 2020-2023  润新知