2011-02-03 3 views
1

SQL Server 2008에서 아래 코드 프로젝트 사이트의 정규식 일치 및 바꾸기 기능을 사용하고 있으며 정상적으로 작동합니다. http://www.codeproject.com/KB/string/SqlRegEx.aspx?msg=3683405#xx3683405xx. 이 함수는 기본적으로 열 텍스트를 조회하고 일치하는 항목을 찾고 대체 된 텍스트로 바꿉니다. 나는 여기서 역 참조를 사용했다.Regular Expression에서 SQL 서버에 삽입했습니다.

열 1이 '345은 9999과 장소 001에 의해 대해 참조되는 첫 번째 기사 번호를'이 있다면, 그것은 반환 # 9999 345 # 001

SELECT 문 선택, 컬럼, dbo.ufn_RegExReplace (열 1 '(? \ D +), ($ \ {First_number_match} # $ {Second_number_match} # Third_number_match ', 1) 잘 작동하고 있습니다.

내가 원하는 것은 테이블의 세 열에 345 # 9999 # 001을 삽입하는 것입니다.

내 실제 문제는 정규 표현식을 사용해야한다는 점에 유의하십시오. 나는이 문제에 초점을 맞추기 위해 전문가들을 간소화했다.

우리가 알고 있듯이 Regex는 신경을 쓰고 SQL을 사용하여 SQL을 추가합니다. 그래서 나는 이것에 대한 도움을 주실 것입니다. 시간을내어 읽어 주셔서 감사합니다.

+0

귀하의 질문을 이해할 수 있을지 잘 모르겠습니다. '345 # 9999 # 001'을 세 부분으로 나누고 각 부분을 다른 열에 삽입 하시겠습니까? 아니면 각 세 열의 전체 문자열을 원하십니까? –

+0

귀하의 링크에 설명 된 기능을 이해 했으므로 ufn_RegExReplace 대신 ufn_RegExSplit 함수를 사용해야합니다. – Lamak

+0

Patrick Echterbruch : 예 가정은 정확합니다. 감사합니다 – user219628

답변

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 개 출력 매개 변수로 할 수있다.

+0

감사합니다 nybbler,이 내가 설명하는 예제에서 작동 할 수 있습니다. 그러나 실제 시나리오에서는 정규식을 사용하여 텍스트를 추출해야합니다. 나는 예제를 단순화했다. – user219628