失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > SQL Server中执行正则表达式

SQL Server中执行正则表达式

时间:2023-09-08 15:00:14

相关推荐

SQL Server中执行正则表达式

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

一、查询函数

-- ============================================= -- Author:<liudong> -- Create date: </11/06> -- Description: <sql正则表达式> -- ============================================= CREATE FUNCTION Reg ( @pattern varchar(2000), @matchstring varchar(8000) ) returns int asbegin declare @objRegexExp int declare @strErrorMessage varchar(255) declare @hr int,@match bit exec @hr= sp_OACreate 'VBScript.RegExp', @objRegexExp out if @hr = 0exec @hr= sp_OASetProperty @objRegexExp, 'Pattern', @pattern if @hr = 0exec @hr= sp_OASetProperty @objRegexExp, 'IgnoreCase', 1 if @hr = 0exec @hr= sp_OAMethod @objRegexExp, 'Test', @match OUT, @matchstring if @hr <>0begin 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) ASBEGINDECLARE @hr INTEGERDECLARE @objRegExp INTEGERDECLARE @result VARCHAR (5000) EXEC @hr = sp_OACreate 'VBScript.RegExp',@objRegExp OUTPUTIF @hr <> 0BEGINEXEC @hr = sp_OADestroy @objRegExp RETURN NULLEND EXEC @hr = sp_OASetProperty @objRegExp,'Pattern',@regexpIF @hr <> 0BEGINEXEC @hr = sp_OADestroy @objRegExp RETURN NULLEND EXEC @hr = sp_OASetProperty @objRegExp,'Global',@globalReplaceIF @hr <> 0BEGINEXEC @hr = sp_OADestroy @objRegExp RETURN NULLEND EXEC @hr = sp_OASetProperty @objRegExp,'IgnoreCase',@ignoreCaseIF @hr <> 0BEGINEXEC @hr = sp_OADestroy @objRegExp RETURN NULLEND EXEC @hr = sp_OAMethod @objRegExp,'Replace',@result OUTPUT,@source,@replaceIF @hr <> 0BEGINEXEC @hr = sp_OADestroy @objRegExp RETURN NULLEND EXEC @hr = sp_OADestroy @objRegExpIF @hr <> 0BEGINRETURN NULLEND RETURN @resultEND

三、执行update

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

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

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

关于数据库恢复的参考:

/dba_huangzj/article/details/8491327/dudu/archive//10/15/sql_server_recover_deleted_records.html

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

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

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

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

/database/11/166792.html/simadi/p/4288466.html/regex

如果觉得《SQL Server中执行正则表达式》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。