1. 程式人生 > >sqlserver 正則函式

sqlserver 正則函式

參考許多資料,終於在SQLSERVER中通過函式實現正則,雖然沒有程式設計靈活,但勝在方便簡單,拿來就能用。

此函式主要用於網頁,中間匹配的多個用<br>分開,可根據需要自己定義。

create FUNCTION [dbo].[regexMatch]

(
@string text,   --需要匹配的源字串
@pattern varchar(1000)  --正則表示式 如 <cellname>([^<>]*)\<\/cellname>|<text>([^<>]*)\<\/text>
[email protected]
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 @
[email protected]
+'<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