sqlserver 正则函数

来源:互联网 发布:arduino 单片机 区别 编辑:程序博客网 时间:2024/06/03 04:26

参考许多资料,终于在SQLSERVER中通过函数实现正则,虽然没有编程灵活,但胜在方便简单,拿来就能用。

此函数主要用于网页,中间匹配的多个用<br>分开,可根据需要自己定义。

create FUNCTION [dbo].[regexMatch]

(
@string text,   --需要匹配的源字符串
@pattern varchar(1000)  --正则表达式 如 <cellname>([^<>]*)\<\/cellname>|<text>([^<>]*)\<\/text>
--@ignorecase bit = 0  --是否区分大小写,默认为false
)
RETURNS nvarchar(max)  
AS


BEGIN


DECLARE @objRegex INT, @retstr varchar(8000)='',@tcount int,@useint int=0
DECLARE @objMatchCollection INT,@objMatch int,@mstr varchar(1000)
    --创建对象  
    EXEC sp_OACreate 'VBScript.RegExp', @objRegex OUT  
    --设置属性  
    EXEC sp_OASetProperty @objRegex, 'Pattern', @pattern  
    EXEC sp_OASetProperty @objRegex, 'IgnoreCase', 0  
    EXEC sp_OASetProperty @objRegex, 'Global', 1  
    --执行  
    EXEC sp_OAMethod @objRegex, 'Execute', @objMatchCollection OUT, @string 


EXEC sp_OAGetProperty @objMatchCollection, 'Count', @tcount out 


while @useint<@tcount
begin
EXEC sp_OAMethod @objMatchCollection , 'Item', @objMatch OUT,@useint
EXEC sp_OAGetProperty @objMatch, 'Value', @mstr out 
set @retstr+=@mstr+'<br>'+char(13)
set @useint+=1
end


    --释放  
    EXECUTE sp_OADestroy @objRegex  
EXECUTE sp_OADestroy @objMatchCollection 
EXECUTE sp_OADestroy @objMatch 
-- RETURN @tcount
    RETURN @retstr

END

/*
 --使用时需要开启对OLE存储过程的使用:
    exec sp_configure 'Ole Automation Procedures', 1 reconfigure
 
 --在设置此配置时有可能会提示“配置选项'Ole Automation Procedures' 不存在,也可能是高级选项。”的错误,解决办法是在配置之前执行语句:
    exec sp_configure 'show advanced options',1 reconfigure
*/

使用示例


select  dbo.[regexMatch]('<emr>
<inp_info chineseName="一般信息" father="bl">
<name chineseName="姓名" vid="e5">刘洪</name>
<dept chineseName="科室" vid="e1">骨伤科</dept>
<bedno chineseName="床号" vid="e3">6530</bedno>
<sex chineseName="性别" vid="e6">男性</sex>
<age chineseName="年龄" vid="e7">53岁</age>
<marriage chineseName="婚姻" vid="e9">已婚</marriage>
<birthplace chineseName="出生地" vid="e10" fwDate="2017-09-06 17:09:47.164" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:09:47.168">市中区白马镇</birthplace>
<profession chineseName="职业" vid="e8" fwDate="2017-09-06 17:09:40.291" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:09:40.295">农民</profession>
<inhos_date chineseName="入院时间" vid="e13">2017年09月06日 15:50</inhos_date>
<jnrq chineseName="记录时间" typeid="1" vid="e15" fwDate="2017-09-06 17:10:00.915" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:10:00.918">2017年09月06日 17:00</jnrq>
<serial_number chineseName="住院号" vid="e4">0000018878</serial_number>
<nation chineseName="民族" vid="e11">汉族</nation>
<dz chineseName="地址内容" vid="e12" fwDate="2017-09-06 17:09:54.348" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:09:54.351">市中区白马镇 </dz>
</inp_info>
</emr>','chineseName="([^"]*)"|>([^<]*)<')  as ddd

原创粉丝点击