2013-10-11 8 views
0

T-SQL을 사용하여 {}에 포함 된 문자열을 다음 단락에서 구문 분석하고 표시해야합니다.{중괄호} 토큰 구문 분석

다음은 {Term1}이 (가)있는 테스트 문장입니다. 언젠가, {Term2}는 {Phrase Term3}과 같은 단어 나 구일 수 있습니다. {Term2}가 반복됩니다. 일부 용어는 {Term2}와 같은 다른 용어의 복수형이 될 수 있습니다. 여기에 실제 {Simple} 용어가 있습니다.

원하는 결과 :

Term1 
Term2 
Phrase Term3 
Term2 
Term2 
Simple 
+1

은 왜 T-SQL에서이 작업을 수행해야합니까? C#이나 다른 어떤 것보다 더 좋은 것처럼 보입니다. –

답변

3

당신은 다중 문 테이블 반환 함수와 함께이 작업을 수행 할 수 있습니다,하지만 난 정말 구문 분석이 유형의 훨씬 더 강력한 언어로 왼쪽라고 생각합니다. 이렇게하면 토큰 {up to 255 characters}이 처리되고 SQL Server 버전에 따라 최대 약 8,000 자의 문자열이 입력됩니다. 더 필요하면 sys.all_columnsyour own numbers table으로 대체하십시오.

DECLARE @x NVARCHAR(MAX); 

SET @x = N'foo{bar} and think {splunge}'; 

SELECT Item FROM dbo.ParseTokens(@x, '{', '}') ORDER BY [Index]; 

결과 :

Item 
------- 
bar 
splunge 
독립 실행 형 문자열 - ... 내가 유효하지 않은 토큰 서열로부터 보호하기 위해 어떤 노력을하지 않았다

CREATE FUNCTION dbo.ParseTokens 
(
    @string NVARCHAR(MAX), 
    @token1 NVARCHAR(255), 
    @token2 NVARCHAR(255) 
) 
RETURNS @t TABLE([Index] INT IDENTITY(1,1), Item NVARCHAR(255)) 
AS 
BEGIN 
    INSERT @t(Item) 
    SELECT SUBSTRING(x, 1, COALESCE(NULLIF(CHARINDEX(@token2, x)-1,-1),255)) 
    FROM 
    (
     SELECT Number, x = SUBSTRING(@string, Number, 
     CHARINDEX(@token1, @string + @token1, Number) - Number) 
     FROM 
     (
     SELECT ROW_NUMBER() OVER (ORDER BY [object_id]) 
      FROM sys.all_columns 
    ) AS n(Number) WHERE Number <= CONVERT(INT, LEN(@string)) 
     AND SUBSTRING(@token1 + @string, Number, LEN(@token1)) = @token1 
    ) AS y 
    ORDER BY Number OPTION (MAXDOP 1); 

    DELETE @t WHERE [Index] = 1; 

    RETURN; 
END 
GO 

샘플 사용을 참고

샘플 사용 현황 - 테이블 반대

DECLARE @x TABLE(ID INT IDENTITY(1,1), n NVARCHAR(MAX)); 

INSERT @x SELECT N'Here is a test sentence with a {Term1}. Sometime, a {Term2} 
    could be a word or phrase like {Phrase Term3}. {Term2} is repeated. Some Terms 
    could be a plural form of a another Term like {Term2}s. Here is a real 
    {Simple} Term.'; 

INSERT @x SELECT N'Hello {foo} there {bar} ...'; 

SELECT t.ID, p.Item 
FROM @x AS t 
CROSS APPLY dbo.ParseTokens(t.n, '{', '}') AS p; 

결과 :

ID  Item 
---- ------------ 
1  Term1 
1  Term2 
1  Phrase Term3 
1  Term2 
1  Term2 
1  Simple 
2  foo 
2  bar 
3

당신은 닫는 요소 시작 요소와 모든 { 모든 }를 대체하여 XML로 문자열을 변환 한 다음 토큰에 대한 XML을 조회 할 수 있습니다.

declare @S nvarchar(max) 
set @S = N'Here is a test sentence with a {Term1}. Sometime, a {Term2} could be a word or phrase like {Phrase Term3}. {Term2} is repeated. Some Terms could be a plural form of a another Term like {Term2}s. Here is a real {Simple} Term.' 

select T.N.value('text()[1]', 'nvarchar(max)') as Token 
from (select cast(replace(replace(@S, N'{', N'<token>'), N'}', N'</token>') as xml)) as S(X) 
    cross apply S.X.nodes('token') as T(N) 

SQL Fiddle

+1

오, 당신과 당신의 멋진 XML! (+1) –

관련 문제