SQL Server 中自定义正则解析存储过程

1、场景描述

领料明细表中有个 PartDesc 字段,里面包含了中文的原材料名称。需要将这些中文字符提取到 MateName 字段中,作为原材料编码的关键字段。

处理前:

处理后:

2、分析

SQL Server 中没有内置的,可以提取中文字符串的函数,但是存储过程可以使用正则脚本来提取中文字符串。

作者定义了一个名为 RegexValue 存储过程来实现这个需求,用法如下:

UPDATE A SET A.MateName=dbo.RegexValue(A.PartDesc, '([\u4e00-\u9fa5]+)', 0) FROM PickingRecord A

3、RegexValue 存储过程的源码

ALTER FUNCTION [dbo].[RegexValue]
(
@string VARCHAR(MAX),
@pattern VARCHAR(255),
@IgnoreCase INT = 0 --0区分大小写 1不区分大小写
)
RETURNS VARCHAR(8000) AS
BEGIN
    DECLARE @Response INT, @objRegex INT, @objMatch INT, @matchCount INT, @matchStr VARCHAR(1000)
    --创建对象
    EXEC @Response = sp_OACreate 'VBScript.RegExp', @objRegex Output
    
    --设置属性
    IF @Response=0
        EXEC @Response = sp_OASetProperty @objRegex, 'Pattern', @pattern
    
    IF @Response=0
        EXEC @Response = sp_OASetProperty @objRegex, 'IgnoreCase', @IgnoreCase
    
    IF @Response=0
        EXEC @Response = sp_OASetProperty @objRegex, 'Global', 1
    
    --执行
    IF @Response=0
        EXEC @Response = sp_OAMethod @objRegex, 'execute', @objMatch OUT, @string
    
    IF @Response = 0
        EXEC @Response = sp_OAGetProperty @objMatch, 'count', @matchCount OUT;
        
    IF @Response = 0 AND @matchCount >= 1
        EXEC @Response = sp_OAGetProperty @objMatch, 'item(0).Value', @matchStr OUT;
    
    EXEC sp_OADestroy @objMatch
    EXEC sp_OADestroy @objRegex


    RETURN @matchStr;
END

前一篇:
后一篇:

发表评论