我需要的是在表的特定列(数据类型: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数据范围内 声明已经终止。
谢谢
答案 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字符串是一个混乱,导致大量的转换和不必要的开销