在列类型文本SQL Server的列中搜索替换文本

Pab*_*buc 0 sql-server stored-procedures sql-server-2008 text-manipulation

我需要的是在表的特定列(数据类型:)中搜索字符串text并将其替换为另一个文本.

例如

Id          |          Text
-----------------------------
1                   this is test
2                   that is testosterone
Run Code Online (Sandbox Code Playgroud)

如果我选择用测验替换测试,结果应该是

this is quiz
that is quizosterone
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过什么?

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
Run Code Online (Sandbox Code Playgroud)

我收到错误:

消息7116,级别16,状态4,过程SearchAndReplace,行31
偏移1900不在可用LOB数据的范围内.
该语句已终止.

谢谢

ber*_*d_k 5

如果您无法永久更改列类型,则可以动态投射它们:

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
Run Code Online (Sandbox Code Playgroud)