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

时间:2010-12-30 12:17:48

标签: sql-server sql-server-2008 stored-procedures text-manipulation

我需要的是在表的特定列(数据类型: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

我收到错误:

  

Msg 7116,Level 16,State 4,Procedure SearchAndReplace,Line 31
  偏移量1900不在可用的LOB数据范围内   声明已经终止。

谢谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

从文本上的MSDN文档,ntext,image:

  

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类型 - 尝试坚持一个设置 - {{1} 1}}和常规TEXT/VARCHAR(MAX)参数,或者然后使用所有Unicode字符串:VARCHAR(100)NTEXT/NVARCHAR(MAX)。不断混合那些非Unicode和Unicode字符串是一个混乱,导致大量的转换和不必要的开销