【问题标题】:Insert into SQL server from Regular Expression returned text从正则表达式返回的文本插入 SQL 服务器
【发布时间】:2011-02-04 06:11:02
【问题描述】:

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

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

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

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

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

我们知道正则表达式很伤脑筋,与 SQL 一起使用会增加它的负担。因此,我将不胜感激这方面的任何帮助。 感谢您抽出宝贵时间阅读本文。

【问题讨论】:

  • 我不确定我是否理解你的问题。是否要将345#9999#001 拆分为三个部分并将每个部分插入不同的列?或者你想要三列中每一列的完整字符串?
  • 根据我对您链接中描述的功能的理解,您应该使用功能 ufn_RegExSplit 而不是 ufn_RegExReplace
  • Patrick Echterbruch:是的,你的假设是正确的。谢谢

标签: regex tsql insert backreference


【解决方案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 个输出参数。

【讨论】:

  • 感谢 nybbler,这适用于我描述的示例。但实际情况下,必须使用正则表达式提取文本。不过我简化了这个例子。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2021-08-31
相关资源
最近更新 更多