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>|([^<>]*)\<\/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+'
'+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]('

  
  
刘洪
骨伤科
6530
男性
53岁
已婚
市中区白马镇
农民
2017年09月06日 15:50
2017年09月06日 17:00
0000018878

汉族

市中区白马镇 


  
         
  
  
  
  
  
本人及其女
可靠
处暑  
  
跌伤致右侧肩锁部肿痛、疼痛、活动受限1小时
 病员及其女自诉入院于2017年09月06日下午2点过,因骑电瓶车不慎跌倒,致右肩锁部,右额部受伤,伤后感上述部位疼痛,活动受限,无头晕,头痛,昏迷,恶心,呕吐。在外未做任何治疗,由家属急送来我院,急诊予以收入本科治疗。现病员神清神差,伤后未进食,未排二便。 
有慢性胃炎病史。右耳听力下降。6年前曾行开颅手术。否认有肝炎、结核等传染病史,否认有高血压,糖尿病等内科疾患史。否认输血史。否认药敏史,预防接种史不详。  
生居当地,生活无不良嗜好。 
  
否认家族病史。 
发育正常,营养中等,体型适中,神志清楚,表情痛苦,语声清晰,查体合作,扶入病房。舌质淡红,苔薄白,脉弦。 
 36.6 
 82
20
128/73
 全身皮肤粘膜未见黄染淤斑,浅表淋巴结未扪及肿痛。胸廓无畸形,呼吸均匀,双肺呼吸音稍促,未闻及干湿鸣音,胸廓挤压痛阴性,心界大小正常,心率872次/分,无病理性杂音。腹部平软,无压痛反跳痛及肌紧张,肝脾未扪及肿痛,双肾区无叩击痛,无移动性浊音,肠鸣音正常,肛门外生殖器未查,脊柱,双下肢,左上肢无压痛,叩击痛,右上肢见专科情况。神经系统生理反射存在,病理征未引出。
 右锁骨中份瘀紫肿胀明显,压叩痛剧烈,扪及骨擦感,纵轴挤压试验因疼痛无法进行,右手各指感觉、运动、血循尚可。左额部皮肤擦伤,无渗血,双侧瞳孔等大等圆,光反射灵敏,眼,耳,口,鼻腔未见血性分泌物。
DR片:(2017.09.06.285025 乐山市中医医院)1、双肺纹理增多,心脏稍大。2、右侧锁骨骨折,断端上下错位,断端周围可见游离小骨片影。
2、右额部皮肤擦伤
3、慢性胃炎
 骨断筋伤,血瘀气滞]]>

2、右额部皮肤擦伤
3、慢性胃炎]]>

熊淑云 
  
  
  
  
  
曹忠 
已婚,育1女。  
  
2017年09月06日 17:20
  
  
  
  
  
  
  


  


  


  


  


  


  


  
...
[医生签名]
...
[医生签名]


[医生签名]


...
[医生签名]
...
[医生签名]
  
[签名日期]
  
  
   
','vid="e([^>]*)>([^<>\s]*)') as ddd

你可能感兴趣的:(MSsql server 正则函数)