日期:2014-05-18 浏览次数:20487 次
create table A(id int,text varchar(100)) insert into A values(1,'和兔子安定发生发生扩大发狮子挥和按时豆腐脑氨基酸地方了就') insert into A values(2,'猴子来了似的发射点喀什酱豆腐度时度') create table B(id int,name varchar(10)) insert into B values(1, '老虎') insert into B values(2, '狮子') insert into B values(3, '大象') insert into B values(4, '兔子') insert into B values(5, '猴子') go select a.id , replace(a.text , b.name , '*** ') text from a,b where charindex(b.name,a.text) > 0 drop table A,B /* id text ----------- ---------------------------------------------------- 1 和兔子安定发生发生扩大发*** 挥和按时豆腐脑氨基酸地方了就 1 和*** 安定发生发生扩大发狮子挥和按时豆腐脑氨基酸地方了就 2 *** 来了似的发射点喀什酱豆腐度时度 (所影响的行数为 3 行) */
------解决方案--------------------
最好的办法是用自定义函数.当然SQL2005里更方便.
我下面这个是用动态语句写的.
CREATE TABLE ta(id INT IDENTITY(1,1),[TEXT] VARCHAR(200))
INSERT ta
SELECT '和兔子安定发生发生扩大发狮子挥和按时豆腐脑氨基酸地方了就'
UNION ALL SELECT '猴子来了似的发射点喀什酱豆腐度时度'
CREATE TABLE tb(id INT IDENTITY(1,1),[Name] VARCHAR(20))
INSERT tb
SELECT '老虎'
UNION ALL SELECT '狮子'
UNION ALL SELECT '大象'
UNION ALL SELECT '兔子'
UNION ALL SELECT '猴子'
DECLARE @badstr VARCHAR(1000),@rplstr VARCHAR(1000)
SELECT @rplstr='',@badstr=''
SELECT @rplstr=@rplstr + 'replace(',@badstr=@badstr + ',''' + Name + ''',''***'')' FROM tb
EXEC('SELECT id,Text='+ @rplstr+'TEXT'+@badstr + ' FROM ta')
DROP TABLE ta,tb
/*
(所影响的行数为 2 行)
(所影响的行数为 5 行)
id Text
----------- ----------------------------------------------------------------------------------------------------------------
1 和***安定发生发生扩大发***挥和按时豆腐脑氨基酸地方了就
2 ***来了似的发射点喀什酱豆腐度时度
*/
------解决方案--------------------
replace不支持ntext型数据.
ntext型数据的替换需要自己写存储过程实现.
或者,你可以尝试,将 NTEXT数据CONVERT或CAST成VARCHAR再操作.
CREATE TABLE ta(id INT IDENTITY(1,1),[TEXT] NTEXT) INSERT ta SELECT N'和兔子安定发生发生扩大发狮子挥和按时豆腐脑氨基酸地方了就' UNION ALL SELECT N'猴子来了似的发射点喀什酱豆腐度时度' CREATE TABLE tb(id INT IDENTITY(1,1),[Name] VARCHAR(20)) INSERT tb SELECT '老虎' UNION ALL SELECT '狮子' UNION ALL SELECT '大象' UNION ALL SELECT '兔子' UNION ALL SELECT '猴子' DECLARE @badstr VARCHAR(1000),@rplstr VARCHAR(1000) SELECT @rplstr='',@badstr='' SELECT @rplstr=@rplstr + 'replace(',@badstr=@badstr + ',''' + Name + ''',''***'')' FROM tb EXEC('SELECT id,Text='+ @rplstr+'CAST(TEXT as VARCHAR(2000))'+@badstr + ' FROM ta') DROP TABLE ta,tb