思路是这样:
对库中的数据表(表A)同步建立一个同结构的表(表B),新增一个时间字段(tim),B表的主键除与A表同之外,另外再加时间字段,一起为主键(KEY)
表A建一个触发器,当对表A中数据进行新增修改的时候,把数据同步到B表。
ALTER TRIGGER t_pm_gundongzhicheng_Trigger1
ON dbo.t_pm_gundongzhicheng
FOR INSERT, UPDATE
AS
insert t_pm_gundongzhicheng_h select * from inserted
这样B表就有了各时间修改的数据
当然也可以进一步优化,主键相同的,只保留最多两个记录。这里是把每次修改都进行了数据同步。
这样便有了数据基础。
用前端的数据来历史库中查询,如主键相同,记录数大于2的即返回一个1,表示该数据有变动。
这个查询我们用存储过程来实现.
存储过程如下:
ALTER proc dbo.tm_check(@dkh varchar(50),@Pro varchar(50),@zb varchar(50),@byid varchar(50),@zdm varchar(50),@dqz varchar(100),@lx int=1)
--过程变量说明
--这位朋友用4个字段做为记录唯一性的标记,因此前4个变量用于在历史B表中定位查找同一记录,4个值从FR中传入如A5[$$$],E5[$$$]这样
--第5个变量,是要对比的字段名,第6个变量是取FR的当前值$$$,
--第6个变更,主要用于区别比较的值是数据还是字符串。这个默认为1即字符串比较
--下面是具体的过程,查4个主键值相等,而对比字段不等的记录,如果存在,则返回记录数。
as
set nocount on
declare @str varchar(2000),@str1 varchar(100)
--declare @dkh varchar(50),
--declare @pro varchar(50),@zb varchar(50),@byid varchar(50),@zdm varchar(50),@dqz varchar(100),@lx int
--select @dkh='ppp',@pro='pro',@zb='zb',@byid='byid',@zdm='dakehu',@dqz='',@lx=0
if @lx=1
select @str1='isnull('+@zdm+','''')<>'''+isnull(@dqz,'')+''''
if @lx=0
begin
if isnull(@dqz,'')=''
select @dqz=null
select @str1='isnull('+@zdm+',0)<>'+isnull(@dqz,'0')+''
end
select @str='select count(1) from t_pm_gundongzhicheng_h
where isnull(dakehu,'''')='''+isnull(@dkh,'')+'''
and isnull(projectname,'''')='''+isnull(@pro,'')+'''
and isnull(zhibiao,'''')='''+isnull(@zb,'')+'''
and isnull(beiyongid,'''')='''+isnull(@byid,'')+'''
and '+@str1
--insert into tm_ls(zf) select @str
--select isnull(@dkh,'')+isnull(@pro,'')+isnull(@zb,'')+isnull(@byid,'')+isnull(@zdm,'')+isnull(@dqz,'')
exec(@str)
--select 1
|