2011-02-03 63 views
1

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

例如如果列1有 '的第一篇文章#345是由9999和发生在001 refered',它将返回 345#9999#001

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

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

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

正如我们所知,正则表达式非常神经兮兮,并且使用SQL来增加它。所以我会很感激这方面的帮助。 感谢您的时间阅读此。

+0

我不知道我是否理解你的问题。您是否想将345#9999#001分为三部分,并将每个部分插入不同的列?或者你想要在三列中的每一列中的完整字符串? – 2011-02-03 18:56:10

+0

根据我所了解的链接中描述的功能,您应该使用函数ufn_RegExSplit而不是ufn_RegExReplace – Lamak 2011-02-03 19:21:14

回答

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个输出参数。