MSsql server 正则函数

实际工作中,我们可能会使用数据库截取处理字符串这里有两种方式

一、.net写代码函数 编译成dll,然后数据库引用dll,从而调用dll里面的函数

二、直接通过数据库自带的OLE 创建VBScript.RegExp对象编写数据库函数

这里介绍第二种

以下为函数

/*
--使用时需要开启对OLE存储过程的使用:
exec sp_configure 'Ole Automation Procedures', 1 reconfigure

--在设置此配置时有可能会提示“配置选项'Ole Automation Procedures' 不存在,也可能是高级选项。”的错误,解决办法是在配置之前执行语句:
exec sp_configure 'show advanced options',1 reconfigure

你可以理解,正则表达式((?!hede).)*匹配字符串"ABhedeCD"的结果false,因为在e3位置,(?!hede)匹配不合格,它之前有"hede"字符串,也就是包含了指定的字符串。

在正则表达式里, ?! 是否定式向前查找,它帮我们解决了字符串“不包含”匹配的问题。

*/
/****** Object: UserDefinedFunction [dbo].[regexMatch] Script Date: 2017/3/17 10:55:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

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),@tmpstr 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
if @tmpstr!=@mstr
begin
set @retstr+=@mstr+'<br>'+char(13)
end
set @useint+=1
set @tmpstr=@mstr
end

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

以下为测试文本

select dbo.[regexMatch]('<emr>
<inp_info chineseName="一般信息" father="bl">
<ch>  </ch>
<jzsj>  </jzsj>
<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>
</inp_info>
<nation chineseName="民族" vid="e11">汉族</nation>
<zzdz chineseName="地址" father="dz">
<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>
</zzdz>
<bl>
<blnr chineseName="病史内容">  </blnr>
<bscsz chineseName="病史陈述者">         </bscsz>
<bscszy chineseName="月">  </bscszy>
<bscszr chineseName="日">  </bscszr>
<bscszs chineseName="时">  </bscszs>
<bscszf chineseName="分">  </bscszf>
<bsssqm chineseName="病史属实,签名">  </bsssqm>
<o1 vid="e16" fwDate="2017-09-06 17:10:04.404" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:10:04.407">本人及其女</o1>
<o2 vid="e17">可靠</o2>
<o3 vid="e18" fwDate="2017-09-06 17:10:08.716" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:10:08.719">处暑  </o3>
<o4 vid="e19">  </o4>
<o5 vid="e22" fwDate="2017-09-06 17:10:18.996" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:10:18.999">跌伤致右侧肩锁部肿痛、疼痛、活动受限1小时</o5>
<o6 vid="e23" fwDate="2017-09-06 17:11:20.960" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:11:20.963"> 病员及其女自诉入院于2017年09月06日下午2点过,因骑电瓶车不慎跌倒,致右肩锁部,右额部受伤,伤后感上述部位疼痛,活动受限,无头晕,头痛,昏迷,恶心,呕吐。在外未做任何治疗,由家属急送来我院,急诊予以收入本科治疗。现病员神清神差,伤后未进食,未排二便。 </o6>
<o7 vid="e24" fwDate="2017-09-06 17:16:18.629" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:26:31.828">有慢性胃炎病史。右耳听力下降。6年前曾行开颅手术。否认有肝炎、结核等传染病史,否认有高血压,糖尿病等内科疾患史。否认输血史。否认药敏史,预防接种史不详。  </o7>
<o8 vid="e25" fwDate="2017-09-06 17:16:27.036" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:26:33.748">生居当地,生活无不良嗜好。 </o8>
<o9>  </o9>
<o10 vid="e27" fwDate="2017-09-06 17:26:36.138" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:26:36.141">否认家族病史。 </o10>
<o11 vid="e28" fwDate="2017-09-06 17:20:07.284" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:26:38.800">发育正常,营养中等,体型适中,神志清楚,表情痛苦,语声清晰,查体合作,扶入病房。舌质淡红,苔薄白,脉弦。 </o11>
<o12 vid="e29" fwDate="2017-09-06 17:20:34.720" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:20:34.723"> 36.6 </o12>
<o13 vid="e30" fwDate="2017-09-06 17:20:39.055" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:20:39.058"> 82</o13>
<o14 vid="e31">20</o14>
<o15 vid="e32" fwDate="2017-09-06 17:20:48.081" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:20:48.084">128/73</o15>
<o16 vid="e33" fwDate="2017-09-06 17:21:20.256" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:21:20.260"> 全身皮肤粘膜未见黄染淤斑,浅表淋巴结未扪及肿痛。胸廓无畸形,呼吸均匀,双肺呼吸音稍促,未闻及干湿鸣音,胸廓挤压痛阴性,心界大小正常,心率872次/分,无病理性杂音。腹部平软,无压痛反跳痛及肌紧张,肝脾未扪及肿痛,双肾区无叩击痛,无移动性浊音,肠鸣音正常,肛门外生殖器未查,脊柱,双下肢,左上肢无压痛,叩击痛,右上肢见专科情况。神经系统生理反射存在,病理征未引出。</o16>
<o17 vid="e34" fwDate="2017-09-06 17:22:26.027" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:26:22.061"> 右锁骨中份瘀紫肿胀明显,压叩痛剧烈,扪及骨擦感,纵轴挤压试验因疼痛无法进行,右手各指感觉、运动、血循尚可。左额部皮肤擦伤,无渗血,双侧瞳孔等大等圆,光反射灵敏,眼,耳,口,鼻腔未见血性分泌物。</o17>
<o18 vid="e35" fwDate="2017-09-06 17:24:26.707" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:26:14.782">DR片:(2017.09.06.285025 乐山市中医医院)1、双肺纹理增多,心脏稍大。2、右侧锁骨骨折,断端上下错位,断端周围可见游离小骨片影。</o18>
<o19 vid="e36" fwDate="2017-09-06 17:26:06.947" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:26:06.949"><![CDATA[1、右锁骨粉碎性骨折<BR>2、右额部皮肤擦伤<BR>3、慢性胃炎<BR>&nbsp;骨断筋伤,血瘀气滞]]></o19>
<o20 vid="e37" fwDate="2017-09-06 17:25:44.874" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-07 13:44:03.378"><![CDATA[1、右锁骨粉碎性骨折<BR>2、右额部皮肤擦伤<BR>3、慢性胃炎]]></o20>
<o21 vid="e38">熊淑云 </o21>
<o22>  </o22>
<o23>  </o23>
<o24>  </o24>
<o25>  </o25>
<o26>  </o26>
<o27 vid="e39">曹忠 </o27>
<o28 vid="e26" fwDate="2017-09-06 17:18:51.450" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:26:35.039">已婚,育1女。  </o28>
<qzsj_1 chinsesName="签名时间" typeid="1" vid="e21">  </qzsj_1>
<qzsj_2 chinsesName="签名时间" typeid="1" vid="e41" fwDate="2017-09-06 17:25:51.243" fmDepart="7107" fmLevel="1" fmId="271" fmDate="2017-09-06 17:25:51.246">2017年09月06日 17:20</qzsj_2>
<twnr chineseName="体温内容">  </twnr>
<mbnr chineseName="脉搏内容">  </mbnr>
<hxnr chineseName="呼吸内容">  </hxnr>
<xynr chineseName="血压内容">  </xynr>
<tgjcnr chineseName="体格检查内容">  </tgjcnr>
<fzjcnr chineseName="辅助内容">  </fzjcnr>
<zljh chineseName="诊疗计划">  </zljh>
</bl>
<zs chineseName="主诉" father="zs">
<zsnr chineseName="主诉内容">  </zsnr>
</zs>
<xbs chineseName="现病史" father="xbs">
<xbsnr chineseName="现病史内容">  </xbsnr>
</xbs>
<jws chineseName="既往史" father="jws">
<jwsnr chineseName="既往史内容">  </jwsnr>
</jws>
<grs chineseName="个人史" father="grs">
<grsnr chineseName="个人史内容">  </grsnr>
</grs>
<hys chineseName="婚育史" father="hys">
<hysnr chineseName="婚育史内容">  </hysnr>
</hys>
<jzs chineseName="家族史" father="jzs">
<jzsnr chineseName="家族史内容">  </jzsnr>
</jzs>
<zkjc chineseName="专科情况" father="zkjc">
<zkjcnr chineseName="专科内容">  </zkjcnr>
<cbzd1 chineseName="初步诊断" knowledgebase="ICD_10" typeid="4">...</cbzd1>
<signature3 autoSignature="true" chineseName="医生签名" typeid="5">[医生签名]</signature3>
<xzzd1 chineseName="修正诊断" knowledgebase="ICD_10" typeid="4">...</xzzd1>
<signature4 autoSignature="true" chineseName="医生签名" typeid="5">[医生签名]</signature4>
</zkjc>
<yishengqianming chineseName="医生签名" father="ysqm">
<signature autoSignature="true" chineseName="医生签名" typeid="5">[医生签名]</signature>
</yishengqianming>
<xzzd chineseName="修正诊断" father="xzzd" vid="e42" xzzdflag=""/>
<cbzd chineseName="初步诊断" knowledgebase="ICD_10" typeid="4">...</cbzd>
<signature1 autoSignature="true" chineseName="医生签名" typeid="5">[医生签名]</signature1>
<xzzd chineseName="修正诊断" knowledgebase="ICD_10" typeid="4">...</xzzd>
<signature2 autoSignature="true" chineseName="医生签名" typeid="5">[医生签名]</signature2>
<ysqmsj chineseName="医生签名" typeid="5">  </ysqmsj>
<sjysqmsj chineseName="签名日期" typeid="1">[签名日期]</sjysqmsj>
<ywgms chineseName="药物过敏史">  </ywgms>
<lxdh>  </lxdh>
<m.54>    </m.54></emr>','vid="e([^>]*)>([^<>s]*)') as ddd

原文地址:https://www.cnblogs.com/tobase/p/11690419.html