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