2011-02-03 61 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個輸出參數。