Как подсчитать вхождения строки внутри типа данных TEXT в SQL Server 2005 - PullRequest
2 голосов
/ 23 сентября 2010

В моей таблице есть столбец типа TEXT. Теперь мне нужно найти количество вхождений строки в этом поле TEXT. Я уже создал полнотекстовый индекс для этой таблицы. Но я не знаю, как действовать дальше. Я уже нашел способы подсчета вхождений строк для VARCHAR. Но они не могут быть применены как есть к текстовому полю. Есть предложения?

Ответы [ 4 ]

7 голосов
/ 23 сентября 2010

Попробуйте:

 declare @searchString varchar(max);
 set @searchString = 'something';
 declare @textTable table (txt text);
 insert into @textTable ( txt )
 values  ( 'something that has something 2 times' )

 select 
 (
  datalength(txt) - 
  datalength(replace(cast(txt as varchar(max)), @searchString, ''))
 )
 /datalength(@searchString) [Count]

   from @textTable as tt

Обратите внимание, что приведение к varchar(max) не будет усекать ваш столбец text, так как максимальная длина varchar (max) составляет 2 ^ 31-1 байт или 2 ГБ.

0 голосов
/ 14 июня 2012

Вот как это сделать с помощью ntext:

    CREATE FUNCTION fn_CountInNText 
    (
        @SearchString nvarchar,
        @NTextToSearch ntext
    )
    RETURNS int
    AS
    BEGIN
        RETURN 
        (
        datalength(@NTextToSearch) - 
        datalength(replace(cast(@NTextToSearch as nvarchar(max)), @SearchString, ''))
        )
        /datalength(@SearchString)/2 
    END
    GO

Затем выберите что-то вроде этого:

SELECT dbo.fn_CountInNText('Something',[TheNTextColumn]) AS [Count] 
FROM [TheTable]
0 голосов
/ 16 марта 2011

Имейте в виду, что если вы будете использовать ntext вместо текста, ответ Дениса Валеева не даст правильного ответа.

Текст: переменная длина данных, отличная от Юникода, с максимальной длиной 2 147 483 647 символов.

nText: переменные данные об односторонних изменениях длины с максимальной длиной 1073, 741, 823 символа.

0 голосов
/ 23 сентября 2010

преобразовать это (текстовое) поле в varchar и найти количество

например: convert(varchar(200),textColumn)

...