SQL Server中执行正则表达式

摘要:
如果执行上述函数,将报告以下错误:SQL Server阻塞进程'syssp_可以为OACreate的访问执行以下SQL语句:USEmasterGOsp_configure'showadvancedoptions',1;戈尔配置;GOsp_配置'OleAutomationProcedures',1;戈尔配置;GOsp_配置'AdHocDistributedQueries',1;戈尔配置;GO——查询配置信息RECONFIGURE;EXECsp_配置;测试语句:SELECT*FROM Users WHERE dbo Reg=1 II。替换函数:获取替换的字符串(此函数导致我发生质量事故!)CREATEFUNCTIONdbo.regexReplacereturnSVARCHARASBEGINDECLARE@hrINTEGERDECLARE @ objRegExpINTEGERDECLARE@resultVARCHAREXEC@hr=sp_OACreate'VBScript.RegExp',@objRegExpOUTPUTIF@hr 0BEGINEXEC@hr = sp_OADestroy@objRegExpRETURNNULLENDEXEC@小时=sp_OASetProperty@objRegExp,“图案”,@regexpIF@hr 0BEGINEXEC@hr = sp_OADestroy@objRegExpRETURNNULLENDEXEC@小时=sp_OASetProperty@objRegExp,“全球”,@globalReplaceIF@hr 0BEGINEXEC@hr = sp_OADestroy@objRegExpRETURNNULLENDEXEC@小时=sp_OASetProperty@objRegExp,'忽略案例',@ignoreCaseIF@hr 0BEGINEXEC@hr = sp_OADestroy@objRegExpRETURNNULLENDEXEC@小时=sp_OAMethod@objRegExp,'替换',@resultOUTPUT,@source,@replaceIF@hr 0BEGINEXEC@hr = sp_OADestroy@objRegExpRETURNNULLENDEXEC@小时=sp_OADestroy@objRegExpIF@小时0BEGINRETURNNULLENDRETURN@resultEND3、执行updateupdateMerchandisetContent=dbo。regexReplace(内容,'˂img。

总体方案:写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

    

  

  
    
 
 
 
 

免责声明:文章转载自《SQL Server中执行正则表达式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python调用接口,python接收post请求接口(附完整代码)将Kafka收到的数据传入到redis中下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Web开发-表单验证

表单验证是Web开发中必不可少的一个环节,用来限制用户输入数据的规范和一致性。那么如何能够简化这一任务,让开发人员通过简单的属性设置就能达到目的呢? FineUI在这一点上也是下足了功夫,比Asp.Net原生的CompareValidator、RangeValidator、RequiredFieldValidator等控件好用多了,眼见为实,下面就来详细...

正则表达式模式修正符

模式修正符号在正则表达式定界符之外使用(最后一个斜线“/”之后),例如“php/i”。其中“/php/”是一个正则表达式的模式,而“i”就是修正此模式所使用的修正符号,用来匹配时不区分大小写。模式修正符可以调整正则表达式的解释,扩展了正则表达式在匹配、替换等操作时的某些功能,而且模式修正符号也可以组合使用,更增强了正则表达式的处理能力。例如“/php/Ui...

centos LNMP第一部分环境搭建 LAMP LNMP安装先后顺序 php安装 安装nginx 编写nginx启动脚本 懒汉模式 mv /usr/php/{p.conf.default,p.conf} php运行方式SAPI介绍 第二十三节课

centos  LNMP第一部分环境搭建 LAMP安装先后顺序  LNMP安装先后顺序 php安装 安装nginx  编写nginx启动脚本   懒汉模式  mv   /usr/local/php/{p.conf.default,p.conf}  php运行方式SAPI介绍  第二十三节课 推荐搜狐下载地址:http://mirrors.sohu.com/...

python中正则表达式在中文字符串匹配时的坑

之前一直有使用python 正则表达式来做中文字符串或者中英文数字混合的字符串的匹配,发现有不少情况下会匹配失灵或者结果混乱,并且在不同操作系统上匹配结果也不一致,查了很久都不知道是什么原因。今天终于彻底弄懂了,原来还是python中对中文的编码问题造成的。 解决办法: step1 在设置默认编码为UTF8之后,将正则表达式和待匹配字符串都decode("...

java 正则表达式

java 正则表达式 package com.project.utils; import org.apache.commons.lang.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ContentUtils {...

秀丸编辑器在宏中设置文本替换正则表达式

替换文本中的换行符号为其他符号,这里我需要将换行符号替换为逗号; 首先建立一个以".MAC"后缀的文件,如a.MAC; 其次在文件中保存如下内容: replaceall "[ ]",",", regular; endmacro; 之后再秀丸编辑器的菜单栏"Marco"->"Load record" 点击Browse选择刚才建立的文件,点击OK后....