我想写一个存储过程(SQL server 2008r2),比如我有一个表:
person Columns: Id int (pk) Date_of_birth date not null Phone int allow null Address int allow null Name nvarchat(50) not null
示例数据:
Id=1,Date_of_birth=01/01/1987,phone=88888888,address=null,name='Steve'
在存储过程中更新语句,假设
参数已经声明:
Update person set
Date_of_birth=@dob,phone=@phone,address=@address,name=@name where id=@id
该表具有记录任何更改的触发器。 现在我有一个用于更新上述人员表的asp.net更新页面
问题是,如果用户只想更新address ='apple street',上面的更新语句将更新所有字段但不检查原始值是否为新值,然后忽略该字段然后检查下一个字段。因此,即使列不会更新,我的日志表也会记录所有事件。
此时,我的解决方案
If @dob <> @ori_dob
Begin
Update person set date_of_birth=@dob where id=@id
End
可能这是一个愚蠢的问题,但如果你有更好的想法,请告诉我,谢谢!
答案 0 :(得分:0)
这是OP的评论的答案,并没有解决原始问题。然而,这将是一个相当丑陋的评论。
您可以使用这样的语句查找Address
触发器中UPDATE
的更改:
select i.Id, d.Address as OldAddress, i.Address as NewAddress
from inserted as i inner join
deleted as d on d.Id = i.Id
where d.Address <> i.Address
您要记录的每一列都需要一个这样的声明。
您可以将SELECT
的结果累积到单个表变量中,然后汇总每个Id
的结果。或者,您可以使用INSERT
/ SELECT
将结果直接保存到日志表中。