跟老大交流了一下,需求是这样的
在一张表里每条数据更改会增加一个版本号控制
举个例子
id,name,code,adderss,banben
1,'a','aa','aaa',1
如果界面上修改了这个表中的某个字段 比如说name 从a 变成了b
那么表中数据为
id,name,code,adderss,banben
1,'a','aa','aaa',1
1,'b','aa','aaa',2
当然表中数据不止1条,
现在就是遍历这个表,然后比较同一标示字段的不同版本之间那些字段更改了
也就是遍历所有列
在一张表里每条数据更改会增加一个版本号控制
举个例子
id,name,code,adderss,banben
1,'a','aa','aaa',1
如果界面上修改了这个表中的某个字段 比如说name 从a 变成了b
那么表中数据为
id,name,code,adderss,banben
1,'a','aa','aaa',1
1,'b','aa','aaa',2
当然表中数据不止1条,
现在就是遍历这个表,然后比较同一标示字段的不同版本之间那些字段更改了
也就是遍历所有列
insert TB
select *.deleted,colname from localTBinsert TB
select *.inserted,colname from localTB???
这样?
存储过程有三个参数(表明,版本号1,版本号2)
1.将版本号1 的数据 取出来插入到临时表#A里面
2.将版本号2 的数据取出来插入到临时表#B里面
当然可以用row_number() 函数设个自增长列,这样用while循环好做一点
然后就是比较#A,#B 相同标示字段有那些列值改变了。然后将该列的原值和改变后的值取出来
插入到另一张变更表(这个插入操作已经用存储过程写好了)现在难点就在于 这个while循环,该怎么取出那些列值变了
insert into tb select 1,'a','aa','aaa',1
insert into tb select 1,'b','aa','aaa',2
insert into tb select 2,'c','dd','eee',1
insert into tb select 2,'c','ee','eee',2
insert into TB select 1,'d','aa','aaa',3
insert into TB select 3,'k','kk','kkk',1 --这个是没变的
go
select distinct a.id,
(case when a.name<>b.name then 'name'
when a.code<>b.code then 'code'
when a.adderss<>b.adderss then 'adderss'
end) as 改变的列,
(case when a.name<>b.name then a.name
when a.code<>b.code then a.code
when a.adderss<>b.adderss then a.adderss
end) as 改变的值,
a.banben
from TB a inner join TB b on a.id=b.id and a.banben<>b.banben
/*
id 改变的列 改变的值 banben
----------- ------- ---------- -----------
1 name a 1
1 name b 2
1 name d 3
2 code dd 1
2 code ee 2(5 行受影响)*/
go
drop table tb
地址的英文单词是 address,害得我查了半天错!
table_log(id, 表名,列名,值),然后在表上建立触发器,这样要知道每个表的变化情况,直接从这个表中查,可行?按照楼主的表设计的话,很纠结