2012-07-17 58 views
-1

我想写一个存储过程(SQL服务器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语句,假设 这些参数已申报: Update person set [email protected],[email protected],[email protected],[email protected] where [email protected]

该表具有记录任何更改的触发器。 现在我有一个更新上述人表的一个asp.net更新页面

问题是,如果用户只是想更新地址='苹果街',上述更新语句将更新所有字段,但不检查if原始值=新值,然后忽略此字段,然后检查下一个字段。所以我的日志表会记录所有的事件,即使列不会被更新。

在这一点上,我的解决方案

  1. 通过ID选择所有的值,并将它们存储到本地变量。 使用if-else检查并生成更新语句。最后, 动态运行生成的SQL(sp_executesql)
  2. 按id选择所有值并将它们存储到本地变量中。 使用的if-else检查和seperately更新每个字段:

If @dob <> @ori_dob
Begin
Update person set [email protected] where [email protected]
End

可能这是一个愚蠢的问题,但请咨询我,如果你有更好的想法,谢谢!

+0

您的日志表是否使用个人触发器填充?如果是这样,您可能需要考虑检查每个列,而不是在更新过程中。 – pilotcam 2012-07-17 01:54:03

+0

如果用户只更新其中一列,会出现什么问题?为什么不让他更新所有内容,如果其中一列正在更新已经具有相同的值;让它也被更新。 – Icarus 2012-07-17 01:54:09

+0

@pilotcam我明白了。这是我的另一个解决方案,谢谢。 – 2012-07-17 02:20:54

回答

0

这是对OP评论的回答,并没有解决原始问题。然而,这将是一个相当丑陋的评论。

你可以用这样的语句来找到一个UPDATE触发器中的变化Address

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将结果直接保存到日志表中。

相关问题