一次性替换数据库中所有表所有列的关键字

最近因为公司域名www.megajoy.com要换成www.joy.cn (这里我为公司做一个广告,哈哈)

所以我写了两个存储过程,实现了一次性替换数据库中所有表所有列的关键字,包括了数据表中的所有文本字段(varchar.nvarchar,ntext,text等)..

当然要实现类型为varchar,nvarchar的字段是很容易实现的,用一句SQL就可以搞定:
update Table set Column=Replace(Column,'oldkeyword','newkeyword').

但如果你用这句SQL语句去更新类型为text,ntext的字段是就要报错了:
err info:消息 8116,级别 16,状态 1,第 1 行
参数数据类型 text 对于 replace 函数的参数 1 无效。

这里也许有人会想到,可以先把text,ntext类型转换成varchar,nvarchar来实现,SQL语句如下:
update Table set Column=Replace(Cast(Column as varchar(8000)),'oldkeyword','newkeyword')
但是,你想过没有,如果ntext,text类型的列里,已存放的数据大于8000字节的话,你的数据就会被丢失了。所有,你要
慎用!!

不过还好,MS提供了
updatetext(使用 UPDATETEXT 可以只更改 text、ntext 或 image 列的一部分).

如果你要查看updatetext的用法,请查看SQL联机帮助丛书.

费话不多说了,下面我简单的介绍一下我的解决方案以及实现的关键技术.

1:sp_msforeachtable 用来loop表中的所有列
2:更新类型为ntext,text类型的列时,先判断DATALENGTH(Column)是否大于8000字节,如果小于8000字节的话,我们可以使用
   update Table set Column=Replace(Cast(Column as varchar(8000)),'oldkeyword','newkeyword')来更新。

源码如下:

UpdateTextColumn

ReplaceKeyWord

使用方法如下:Exec ReplaceKeyWord 'www.megajoy.com','www.joy.cn'
以上是全部源代码,如果您发现了错误,欢迎指出,我会在第一时间修改。如果您有更好的解决方案,也欢迎共享,谢谢!!

补充:
如果是mssql2005版本,您只需要如下代码:
MSSQL2005



posted @ 2008-02-03 10:43  ITAres  阅读(2805)  评论(11编辑  收藏  举报