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数据的范围内.
该语句已终止.
谢谢
如果您无法永久更改列类型,则可以动态投射它们:
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)