sqlserver 正則函式
參考許多資料,終於在SQLSERVER中通過函式實現正則,雖然沒有程式設計靈活,但勝在方便簡單,拿來就能用。
此函式主要用於網頁,中間匹配的多個用<br>分開,可根據需要自己定義。
create FUNCTION [dbo].[regexMatch]
(@string text, --需要匹配的源字串
@pattern varchar(1000) --正則表示式 如 <cellname>([^<>]*)\<\/cellname>|<text>([^<>]*)\<\/text>
[email protected]
)
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 @
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