1

在 SQL Server 2008 中,我从下面的代码项目站点构建了一个正则表达式匹配和替换函数,并且运行良好。 http://www.codeproject.com/KB/string/SqlRegEx.aspx?msg=3683405#xx3683405xx。这个函数基本上是查找列文本,找到匹配并用替换的文本替换。我在这里使用了反向引用。

例如,如果 Column1 有“第一篇文章 #345 被 9999 引用并放置在 001 中”,它将返回 345#9999#001

选择语句 Select column1, dbo.ufn_RegExReplace(Column1, '(?\d+). ?(?\d+). ?(?\d+).*?(?\d+)', '${First_number_match}#${ Second_number_match}#Third_number_match',1) 工作正常。

我想要的是将 345#9999#001 插入到表的三列中。

请注意,在我的实际问题中,我将不得不使用正则表达式。我简化了专家以专注于该问题。

正如我们所知,正则表达式令人伤脑筋,并且与 SQL 一起使用会增加它。因此,我将不胜感激这方面的任何帮助。感谢您花时间阅读本文。

4

1 回答 1

1

您可以创建一个字符串拆分函数并使用它来获取您的个人值。例如,像这样:

CREATE FUNCTION dbo.fn_StringSplit(@String NVARCHAR(8000), @Delimiter NCHAR(1))       
RETURNS @tblItems TABLE (item NVARCHAR(8000))       
AS       
BEGIN       
    DECLARE @idx INT       
    DECLARE @slice NVARCHAR(8000)       

    SELECT @idx = 1       
        IF LEN(@String) < 1 OR @String IS NULL  RETURN       

    WHILE (@idx != 0 AND LEN(@string) > 0)
    BEGIN
        SET @idx = CHARINDEX(@Delimiter, @String)       
        IF @idx != 0       
            SET @slice = LEFT(@String, @idx - 1)       
        ELSE       
            SET @slice = @String       

        IF(LEN(@slice) > 0)  
            INSERT INTO @tblItems(item) VALUES (@slice)       

        -- Trim saved item from remaining string 
        SET @String = RIGHT(@String, LEN(@String) - @idx)             
    END
RETURN       
END 

或者,如果需要,您可以修改上述拆分函数以在单个表行中返回 3 个值,或者作为存储过程的 3 个输出参数。

于 2011-02-03T18:52:43.753 回答