SQL2000
表TEST:
ID DATE      NAME    BEIZHU    BEIZHU2
1  2012-2-1  张三      中国        意大利,中国
2  2012-3-1  张三      日本        意大利,中国,日本
3  2013-2-1  李四      美国        美国
4  2012-5-1  张三      印度        意大利,中国,日本,印度
5  2012-1-1  张三      意大利      意大利
在BEIZHU2中是将BEIZHU列中的值根据时间顺序进行字符串的相拼接,现在想要得到的办法是:
比如 修改ID为1 的记录,将中国改为英国,能自动将ID为 2,4的两条记录中BEIZHU2的值分别改为:
将其中的中国自动换为英国。
请问有什么实现的办法吗?特求助。  

解决方案 »

  1.   

    触发器比较靠谱,逻辑很简单,直接replace即可。或者直接在业务系统中发送sql命令replace掉BEIZHU2的相同值。
      

  2.   

    因条件不同,只能用多条语句执行.declare @name varvhar(20)
    set @name='英国'
    update tb set BEIZHU=@name,BEIZHU2=replace(BEIZHU2,'中国',@name) 
    where id=1
    update tb set BEIZHU2=replace(BEIZHU2,'中国',@name) 
    where charindex('中国',BEIZHU2)>0
      

  3.   

    请问如何实现 自动的呢……比如:系统发现ID=1的BEIZHU发生变化后,自动更新,按时间顺序进行判断。这样,我通过程序更新了X行的 BEIZHU数据,同时也想把时间排在X行及以后中的数据的BEIZHU2的值同时更新,。
      

  4.   

    create trigger tru_tb
    on tb
    for update
    as
    begin
    declare @oldName varchar(20)
    declare @newName varchar(20)select @newName=BEIZHU from inserted
    select @oldName=BEIZHU from deletedupdate tb 
    set BEIZHU2=replace(BEIZHU2,@oldName,@newName) 
    where charindex(@oldName,BEIZHU2)>0
    end
      

  5.   

    --创建自定义函数
    create function f_findstr(@s varchar(8000),@find varchar(10),@index int)  
    returns int  
    as  
    begin  
    declare @startindex int  
    set @startindex=0  
    while @index>0  
    begin  
    if charindex(@find,@s,@startindex)>0  
    set @startindex=charindex(@find,@s,@startindex+1)  
    set @index=@index-1  
    end  
    return @startindex  
    end  
    go  --创建触发器
    CREATE TRIGGER [dbo].[tr_test]
       ON [dbo].[test]
       AFTER INSERT,DELETE,UPDATE
    AS 
    BEGIN
    SET NOCOUNT ON;
    DECLARE @i INT,@i2 INT,@i3 INT,@id INT,@nameAll VARCHAR(max),@name VARCHAR(max),@BEIZHU2 VARCHAR(MAX)
    SELECT @i2=1,@nameAll=''
    SELECT @nameAll=@nameAll+','+RTRIM(name) FROM (select name FROM DELETED UNION select name FROM INSERTED) a
    SET @i3=dbo.f_findstr(@nameAll,',',@i2)
    WHILE @i3>0
    BEGIN
    SET @name=SUBSTRING(@nameAll,@i3+1,
    CASE WHEN dbo.f_findstr(@nameAll,',',@i2+1)=0 THEN LEN(@nameAll)-@i2 ELSE dbo.f_findstr(@nameAll,',',@i2+1)-@i2-1 end)
    SET @i=1
    WHILE 1=1
    BEGIN
    IF (SELECT COUNT(*) FROM (SELECT TOP (@i) * FROM test WHERE name=@name) a)=@i
    BEGIN
    SET @id=(SELECT MAX(id) FROM (SELECT TOP (@i) * FROM test WHERE name=@name) a)
    set @BEIZHU2=''
    SELECT @BEIZHU2=@BEIZHU2+','+RTRIM(BEIZHU) FROM test WHERE name=@name AND
    date<=(SELECT date FROM test WHERE id=@id)
    ORDER BY date
    UPDATE test SET BEIZHU2=@BEIZHU2 WHERE id=@id
    END
    else
    BREAK
    SET @i=@i+1
    END
    SET @i2=@i2+1
    SET @i3=dbo.f_findstr(@nameAll,',',@i2)
    END
    END
      

  6.   

    这种表结构设计,很难保证update操作后,数据的一致性。
    建议你把这个合并的操作写成视图来实现,
    当数据变化后,视图查询的结果也相应变化。
    如果考虑到性能,可以在视图上加索引。
      

  7.   


    create table TEST
    (ID int, [DATE] varchar(16), NAME varchar(10), BEIZHU varchar(10), BEIZHU2 varchar(30))insert into TEST
     select 1, '2012-2-1', '张三', '中国', '意大利,中国' union all
     select 2, '2012-3-1', '张三', '日本', '意大利,中国,日本' union all
     select 3, '2013-2-1', '李四', '美国', '美国' union all
     select 4, '2012-5-1', '张三', '印度', '意大利,中国,日本,印度' union all
     select 5, '2012-1-1', '张三', '意大利', '意大利'
    create trigger tr_TEST
    on TEST for update
    as
    begin
     update a
       set a.BEIZHU2=replace(a.BEIZHU2,
                             ','+(select BEIZHU from deleted c where c.ID=b.ID),
                             ','+b.BEIZHU)
       from TEST a
       inner join inserted b on a.NAME=b.NAME 
       where cast(a.[DATE] as datetime)>=cast(b.[DATE] as datetime)
    end
    -- 测试
    update TEST set BEIZHU='英国' where ID=1select * from TEST/*
    ID          DATE             NAME       BEIZHU     BEIZHU2
    ----------- ---------------- ---------- ---------- ------------------------------
    1           2012-2-1         张三         英国         意大利,英国
    2           2012-3-1         张三         日本         意大利,英国,日本
    3           2013-2-1         李四         美国         美国
    4           2012-5-1         张三         印度         意大利,英国,日本,印度
    5           2012-1-1         张三         意大利       意大利(5 row(s) affected)
    */