你如何编写一个好的存储过程进行更新?

时间:2012-07-17 01:48:26

标签: asp.net sql-server

我想写一个存储过程(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',上面的更新语句将更新所有字段但不检查原始值是否为新值,然后忽略该字段然后检查下一个字段。因此,即使列不会更新,我的日志表也会记录所有事件。

此时,我的解决方案

  1. 按ID选择所有值并将其存储到局部变量中。 使用if-else检查并生成更新语句。最后, 动态运行生成的SQL(sp_executesql)
  2. 按ID选择所有值并将其存储到局部变量中。 使用if-else检查并单独更新每个字段:
  3. If @dob <> @ori_dob
    Begin
    Update person set date_of_birth=@dob where id=@id
    End

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

1 个答案:

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