2013-10-11 3 views
0

Мне нужно разобрать строки, заключенные в {}, из следующего абзаца, используя T-SQL, а затем отобразить их.Проигрывать маркеры в {фигурных скобках}

Вот тестовое предложение с {Term1}. Иногда {Term2} может быть словом или фразой типа {Phrase Term3}. {Term2} повторяется. Некоторые термины могут быть множественными формами другого термина типа {Term2} s. Вот реальный {Simple} Term.

Желаемые результаты:

Term1 
Term2 
Phrase Term3 
Term2 
Term2 
Simple 
+1

Почему вы должны сделать это в T-SQL? Кажется, лучше для C# или чего-то еще, действительно. –

ответ

3

Вы можете сделать это с помощью таблицы-значной функции мульти-заявление, но я действительно думаю, что этот тип синтаксического анализа гораздо лучше оставить более мощные языки. Это будет обрабатывать токены {up to 255 characters} и вводить строки до 8000 символов в зависимости от версии SQL Server. Если вам нужно больше, замените sys.all_columns на your own numbers table. Обратите внимание, что я не пошел в какие-либо усилия, чтобы защитить от недопустимых последовательностей лексем ...

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 NVARCHAR(MAX); 

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

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

Результаты:

Item 
------- 
bar 
splunge 

Использование образца - против стола:

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) –

Смежные вопросы