0

我需要的是在表的特定列(数据类型:)中搜索字符串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,过程 SearchAndReplace,第 31 行
偏移量 1900 不在可用 LOB 数据的范围内。
该语句已终止。

谢谢

4

2 回答 2

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
于 2010-12-30T12:43:58.033 回答
3

该数据类型TEXT弃用,不应再使用 - 正是因为它笨重且不支持所有常用的字符串操作方法。

来自 MSDN docs on text, ntext, image:

在 MicrosoftSQL Server 的未来版本中将删除 ntext、text 和 image 数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用 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- 尝试坚持组 - 或者TEXT/VARCHAR(MAX)常规VARCHAR(100)参数,或者然后使用所有 Unicode 字符串:NTEXT/NVARCHAR(MAX)NVARCHAR(100). 不断混合那些非 Unicode 和 Unicode 字符串是一团糟,会导致大量转换和不必要的开销

于 2010-12-30T12:24:02.943 回答