Поиск заменяющего текста в столбце для типа столбца Текст SQL Server - PullRequest
0 голосов
/ 30 декабря 2010

Мне нужно найти строку в определенном столбце (тип данных: text) таблицы и заменить ее другим текстом.

Например

Id          |          Text
-----------------------------
1                   this is test
2                   that is testosterone

Если я выбрал замену теста на тест, результаты должны быть

this is quiz
that is quizosterone

Что я пробовал до сих пор?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROC [dbo].[SearchAndReplace] 
(
     @FindString    NVARCHAR(100)
    ,@ReplaceString NVARCHAR(100)
)
AS
BEGIN
    SET NOCOUNT ON
SELECT CONTENT_ID as id, CONTENT_TEXT, textptr(CONTENT_TEXT) as ptr, datalength(CONTENT_TEXT) as lng
 INTO #newtable6  FROM HTML_CONTENTS 
    DECLARE @COUNTER INT = 0
    DECLARE @TextPointer VARBINARY(16) 
    DECLARE @DeleteLength INT 
    DECLARE @OffSet INT 

    SELECT @TextPointer = TEXTPTR(CONTENT_TEXT)
      FROM #newtable6

    SET @DeleteLength = LEN(@FindString) 
    SET @OffSet = 0
    SET @FindString = '%' + @FindString + '%'

    WHILE (SELECT COUNT(*)
             FROM #newtable6
            WHERE PATINDEX(@FindString, CONTENT_TEXT) <> 0) > 0
    BEGIN 
        SELECT @OffSet = PATINDEX(@FindString, CONTENT_TEXT) - 1
          FROM #newtable6
         WHERE PATINDEX(@FindString, CONTENT_TEXT) <> 0

UPDATETEXT #newtable6.CONTENT_TEXT
            @TextPointer
            @OffSet
            @DeleteLength
            @ReplaceString

           SET @COUNTER = @COUNTER + 1
    END
    select @COUNTER,* from #newtable6
drop table #newtable6
    SET NOCOUNT OFF

Я получаю ошибку:

Сообщение 7116, уровень 16, состояние 4, поиск процедуры и замена, строка 31
Смещение 1900 не входит в диапазон доступных данных больших объектов.
Заявление было прекращено.

Спасибо

Ответы [ 2 ]

5 голосов
/ 30 декабря 2010

Если вы не можете постоянно менять типы столбцов, вы можете разыграть их на лету:

ALTER PROC [dbo].[SearchAndReplace] 
(@FindString    VARCHAR(100),
 @ReplaceString VARCHAR(100) )
AS
BEGIN
   UPDATE dbo.HTML_CONTENTS
   SET CONTENT_TEXT = cast (REPLACE(cast (CONTEXT_TEXT as varchar(max)), @FindString, @ReplaceString) as TEXT)
END
3 голосов
/ 30 декабря 2010

Тип данных TEXT равен устарел и больше не должен использоваться - именно потому, что он неуклюж и не поддерживает все обычные методы работы со строками.

Из документов MSDN по тексту, ntext, изображению:

типы данных ntext, text и image будут быть удаленным в будущей версии MicrosoftSQL Server. Избегайте использования этих типы данных в новых разработках, и планируют изменить приложения, которые в настоящее время использую их. Используйте nvarchar (max), varchar (max) и varbinary (max) вместо .

Моя рекомендация: преобразовать этот столбец в VARCHAR (MAX), и с вами все будет хорошо!

ALTER TABLE dbo.HTML_CONTENTS 
   ALTER COLUMN CONTEXT_TEXT VARCHAR(MAX)

Это должно сделать это.

Когда ваш столбец равен VARCHAR(MAX), ваши хранимые процедуры становятся совершенно простыми:

ALTER PROC [dbo].[SearchAndReplace] 
(@FindString    VARCHAR(100),
 @ReplaceString VARCHAR(100) )
AS
BEGIN
   UPDATE dbo.HTML_CONTENTS
   SET CONTENT_TEXT = REPLACE(CONTEXT_TEXT, @FindString, @ReplaceString)
END

Два замечания на стороне:

  • было бы полезно иметь в вашем хранимом процессе предложение WHERE, чтобы не обновлять всю таблицу (если только это не то, что вам действительно нужно делать)

  • вы используете TEXT в своей таблице, но параметры хранимой процедуры имеют тип NVARCHAR - попробуйте придерживаться one set - либо TEXT/VARCHAR(MAX) и обычного VARCHAR(100) параметров, или затем используйте все строки Unicode: NTEXT/NVARCHAR(MAX) и NVARCHAR(100). Постоянное смешивание строк, не относящихся к Unicode и Unicode, приводит к беспорядку и вызывает много преобразований и ненужных накладных расходов

...