惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - Amwpfiqvy

如何查看执行计划 SQL Server 堆表与栈表的对比(大表) SQL Server中CURD语句的锁流程分析 树表分级统计 - Amwpfiqvy SQL:查询购买了所有指定商品的人 - Amwpfiqvy 查看SQL Server性能时常用的性能计数器 SQL Server中行列转换 Pivot UnPivot Apq本地工具集 Apq.aspx - Amwpfiqvy 第一个:_Config.js JScript.Encode.js - Amwpfiqvy Apq.Threading.js - Amwpfiqvy - 博客园 Script/_Config.js Apq.Text.js Apq.js - Amwpfiqvy - 博客园 prototype.js Apq.aspx - Amwpfiqvy - 博客园 查看数据库所有用户表及其列信息 利用JScript的Literal Syntax特性用字符串表示对象
在SQL Server中使用正则表达式
Amwpfiqvy · 2011-10-18 · via 博客园 - Amwpfiqvy

sqlserver对于字符串的处理比较弱,replace函数也仅仅支持用字符串来作为匹配项,要是需要使用正则表达式,就只能通过系统存储过程来调用VB组件来实现了,下面是两个写好的正则函数:

测试是否匹配:

CREATE FUNCTION dbo.regexIsMatch
(
	@source varchar(5000),   --需要匹配的源字符串
	@regexp varchar(1000),  --正则表达式
	@ignorecase bit = 0  --是否区分大小写,默认为false
)
RETURNS bit  --返回结果-false,-true
AS
BEGIN

	--0(成功)或非零数字(失败),是由OLE 自动化对象返回的HRESULT 的整数值。
	DECLARE @hr integer 

	--用于保存返回的对象令牌,以便之后对该对象进行操作
	DECLARE @objRegExp integer   DECLARE @objMatches integer

	--保存结果
	DECLARE @results bit

	/*
	创建OLE 对象实例,只有sysadmin 固定服务器角色的成员才能执行sp_OACreate,并确定机器中有VBScript.RegExp类库
	*/
	EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
	IF @hr <> 0 BEGIN
		SET @results = 0
		RETURN @results
	END

	EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
	IF @hr <> 0 BEGIN
		SET @results = 0
		RETURN @results
	END
	EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
	IF @hr <> 0 BEGIN
		SET @results = 0
		RETURN @results
	END
	EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
	IF @hr <> 0 BEGIN
		SET @results = 0
		RETURN @results
	END 
	--调用对象方法
	EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
	IF @hr <> 0 BEGIN
		SET @results = 0
		RETURN @results
	END
	--释放已创建的OLE 对象
	EXEC @hr = sp_OADestroy @objRegExp
	IF @hr <> 0 BEGIN
		SET @results = 0
		RETURN @results
	END
	RETURN @results
END

正则替换:

GO
--SQL正则替换函数
CREATE FUNCTION dbo.regexReplace 
( 
	@source ntext, --原字符串
	@regexp varchar(1000), --正则表达式
	@replace varchar(1000), --替换值
	@globalReplace bit = 1, --是否是全局替换
	@ignoreCase bit = 0 --是否忽略大小写
) 
RETURNS varchar(1000) AS 
BEGIN 
	DECLARE @hr integer 
	DECLARE @objRegExp integer 
	DECLARE @result varchar(5000) 

	EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT 
	IF @hr <> 0 BEGIN 
		EXEC @hr = sp_OADestroy @objRegExp 
		RETURN null 
	END 
	EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp 
	IF @hr <> 0 BEGIN 
		EXEC @hr = sp_OADestroy @objRegExp 
		RETURN null 
	END 
	EXEC @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace 
	IF @hr <> 0 BEGIN 
		EXEC @hr = sp_OADestroy @objRegExp 
		RETURN null 
	END 
	EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase 
	IF @hr <> 0 BEGIN 
		EXEC @hr = sp_OADestroy @objRegExp 
		RETURN null 
	END 
	EXEC @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace 
	IF @hr <> 0 BEGIN 
		EXEC @hr = sp_OADestroy @objRegExp 
		RETURN null 
	END 
	EXEC @hr = sp_OADestroy @objRegExp 
		IF @hr <> 0 BEGIN 
		RETURN null 
	END 

	RETURN @result 
END
    关键是sp_OACreate,sp_OADestroy,sp_OASetProperty,sp_OAMethod这几个存储过程的使用,在《编写扩展存储过程》一文里也有这个用法。
 
    测试替换函数:print dbo.regexReplace('sfasdf234sdfds', '\D', '', 1, 0)
 
    使用时需要开启对OLE存储过程的使用:
    exec sp_configure 'Ole Automation Procedures', 1 reconfigure
 
    在设置此配置时有可能会提示“配置选项'Ole Automation Procedures' 不存在,也可能是高级选项。”的错误,解决办法是在配置之前执行语句:
    exec sp_configure 'show advanced options',1 reconfigure