0

我需要根据正则表达式从输入中提取匹配的文本。由于 SQL Server 中没有对正则表达式的内置支持,我编写了以下 UDF 来完成这项工作。

CREATE FUNCTION GetMatch
(
    @Pattern VARCHAR(255),
    @Text VARCHAR(1000)
)
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @Response INT, @ObjRegexExp INT, @ObjMatch INT, @Matchcount INT, @Match VARCHAR(1000);
    DECLARE @source VARCHAR(500), @description VARCHAR(500);

    EXEC @Response = sp_OACreate 'VBScript.RegExp', @ObjRegexExp OUT;

    IF @Response = 0
        EXEC @Response = sp_OASetProperty @ObjRegexExp, 'Pattern', @Pattern;
    IF @Response = 0
        EXEC @Response = sp_OASetProperty @ObjRegexExp, 'IgnoreCase', 1;
    IF @Response = 0
        EXEC @Response = sp_OASetProperty @ObjRegexExp, 'MultiLine', 0;
    IF @Response = 0
        EXEC @Response = sp_OASetProperty @ObjRegexExp, 'Global', 0;                        
    IF @Response = 0
        EXEC @Response = sp_OAMethod @ObjRegexExp, 'execute', @ObjMatch OUT, @Text;
    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', @Match OUT;

    IF @Response <> 0
    BEGIN
        EXEC @Response = sp_OAGetErrorInfo @ObjRegexExp, @source OUT, @description OUT;
        SET @Match = 'source ' + ISNULL(@source, '') + ' -- description ' + ISNULL(@description, '');
    END

    RETURN @Match;
END
GO

我的消费方式如下:-

SELECT Barcode, dbo.GetMatch('(^[a-zA-Z]+)', Barcode) BarcodePrefix
FROM TestData

每次成功执行128 次,然后生成我已由sp_OAGetErrorInfo捕获的错误ODSOLE 扩展过程。知道是什么原因造成的吗?

在此处输入图像描述

4

0 回答 0