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的值分别改为:
将其中的中国自动换为英国。
请问有什么实现的办法吗?特求助。
表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的值分别改为:
将其中的中国自动换为英国。
请问有什么实现的办法吗?特求助。
解决方案 »
- 请教一个sql语句的问题
- SQL Server 2000中的数据和事务日志文件不能存放在压缩文件系统或象共享网络目录等远程的网络驱动器上
- 紧急!!!!!1
- access转sql server为什么总是提示(列前缀 "SP " 与查询中所用的表名或别名不匹配
- 我发誓:这是我从来没遇到的问题!!!!
- 再问:求一条sql语句,如何将一列字符串查询出来并全部连接成一个字符串?
- 查询数据库问题!在线等待
- CEO\大力同志请再看看这个问题
- 字段名命名的问题,常常担心自己的字段名(英文名)不够专业,不够通用,请大家帮帮忙,这方面有没有好的工具
- 关于SQL求救!SQL高高手过来
- MySQL,SQL如何学习
- connection.commit 方法执行成功,但数据库中事务未提交。
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
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
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
建议你把这个合并的操作写成视图来实现,
当数据变化后,视图查询的结果也相应变化。
如果考虑到性能,可以在视图上加索引。
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)
*/