update 表名
set text类型字段名=replace(convert(varchar(8000),text类型字段名),'要替换的字符','替换成的值')
1.update ntext:
(1)varchar和nvarchar类型是支持replace,所以如果你的text/ntext不超过8000/4000可以先转换成前面两种类型再使用replace。
update 表名
set text类型字段名=replace(convert(varchar(8000),text类型字段名),'要替换的字符','替换成的值')
update 表名
set ntext类型字段名=replace(convert(nvarchar(4000),ntext类型字段名),'要替换的字符','替换成的值')
(2)如果text/ntext超过8000/4000,看如下例子
declare @pos int
declare @len int
declare @str nvarchar(4000)
declare @des nvarchar(4000)
declare @count int
set @des ='<requested_amount+1>'--要替换成的值
set @len=len(@des)
set @str= '<requested_amount>'--要替换的字符
set @count=0--统计次数.
WHILE 1=1
BEGIN
select @pos=patINDEX('%'+@des+'%',propxmldata) - 1
from 表名
where 条件
IF @pos>=0
begin
DECLARE @ptrval binary(16)
SELECT @ptrval = TEXTPTR(字段名)
from 表名
where 条件
UPDATETEXT 表名.字段名 @ptrval @pos @len @str
set @count=@count+1
end
ELSE
break;
END
select @count
2.alter column语句有局限性,比如不允许修改text、image、ntext 或 timestamp 列.
以下提供一个修改ntext列的例子:
Alter Table tbl Add newcol ntext null
go
update tbl set newcol=col
go
EXEC sp_rename 'tbl.col', 'oldcol', 'COLUMN'
go
EXEC sp_rename 'tbl.newcol', 'col', 'COLUMN'
go
alter table tbl drop column oldcol
go
以上通过新增一列替换旧的列方法实现了将一个不允许为空的ntext修改为允许为空的ntext列(注意:以上的go不能缺少).修改表结构之后,由于视图所依赖的基础对象的更改,视图的持久元数据会过期,需要刷新视图,通过sp_refreshview (可以通过sp_depends 找处相关的视图,再通过sp_refreshview逐个刷新).
另外可以也可以通过一下存储过程进行刷新所有视图:
PRINT 'Refreshing all views...'
DECLARE @vName sysname
DECLARE refresh_cursor CURSOR FOR
SELECT Name from sysobjects WHERE xtype = 'V'
order by crdate
FOR READ ONLY
OPEN refresh_cursor
FETCH NEXT FROM refresh_cursor
INTO @vName
WHILE @@FETCH_STATUS <> -1
BEGIN
exec sp_refreshview @vName
PRINT '视图' + @vName + ' refreshed'
FETCH NEXT FROM refresh_cursor
INTO @vName
END
CLOSE refresh_cursor
DEALLOCATE refresh_cursor
text/ntext字段的替换处理--全表替换 --text/ntext字段的替换处理--全表替换
--text/ntext字段的替换处理--全表替换
--SELECT * FROM #tb
/*
--创建数据测试环境
create table test(id varchar(3),txt ntext)
insert into test
select '001','A*B'
union all select '002','A*B-AA*BB'
go
*/
--定义替换的字符串
declare @s_str varchar(8000),@d_str varchar(8000)
select @s_str='www.leods.com' --要替换的字符串
,@d_str='www.4wdcc.com' --替换成的字符串
--定义游标,循环处理数据
declare @id varchar(12)
declare #tb cursor for select id from ta_news
open #tb
fetch next from #tb into @id
while @@fetch_status=0
begin
--字符串替换处理
declare @p varbinary(16),@postion int,@rplen int
select @p=textptr([Content])
,@rplen=len(@s_str)
,@postion=charindex(@s_str,[Content])-1
from ta_news where id=@id
while @postion>0
begin
updatetext ta_news.[Content] @p @postion @rplen @d_str
select @postion=charindex(@s_str,[Content])-1 from ta_news where id=@id
end
fetch next from #tb into @id
end
close #tb
deallocate #tb
/*
--显示结果
select * from test
go
--删除数据测试环境
drop table test
方法二:
--定义替换的字符串
declare @s_str varchar(8000),@r_str varchar(8000)
select @s_str='<script src=http://www.dota11.cn/m.js></script>' --要替换的字符串
,@r_str='' --替换成的字符串
--替换处理
declare @id int,@ptr varbinary(16)
declare @start int,@s nvarchar(4000),@len int
declare @s_str1 nvarchar(4000),@s_len int,@i int,@step int
select @s_str1=reverse(@s_str),@s_len=len(@s_str)
,@step=case when len(@r_str)>len(@s_str)
then 4000/len(@r_str)*len(@s_str)
else 4000 end
declare tb cursor local for
select id,start=charindex(@s_str,[content])-1
from [news_content]
where charindex(@s_str,[content])>0
--这里可以定义要处理的记录的条件
open tb
fetch tb into @id,@start
while @@fetch_status=0
begin
select @ptr=textptr([content])
,@s=substring([content],@start+1,@step)
from [news_content]
where id=@id
while len(@s)>=@s_len
begin
select @len=len(@s),@i=charindex(@s_str1,reverse(@s))
if @i>0
begin
select @i=case when @i>=@s_len then @s_len else @i end
,@s=replace(@s,@s_str,@r_str)
updatetext [news_content].[content] @ptr @start @len @s
end
else
set @i=@s_len
select @start=@start+len(@s)-@i+1 ,@s=substring([content],@start+1,@step) from [news_content] where id=@id
end
fetch tb into @id,@start
end
close tb
deallocate tb
go