实际工作中,我们可能会使用数据库截取处理字符串这里有两种方式
一、.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) --正则表达式 如
--@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]('
3、慢性胃炎
骨断筋伤,血瘀气滞]]>
3、慢性胃炎]]>