我好好环顾四周但却找不到这个问题的答案: 我有一个存储过程,它在SQL SERVER 2008表上更新大约30个字段。对我来说重要的是,如果值实际发生了变化,其中一个字段只会更新。
目前的存储过程代码段:
ALTER PROCEDURE test
@p_RoomNo int,
[RoomNo] = @p_RoomNo,
我尝试在过程的SET-Clause中将该特定列更改为COALESCE / ISNULL,但它仍然更新该列
[RoomNo] = COALESCE(@p_RoomNo,RoomNo),
[RoomNo] = ISNULL(@p_RoomNo,RoomNo),
两个都给我相同的输出...
您是否有任何想法如何不更新服务器端的值或我是否必须将其放在.asp-Forum上以更改应用程序以不传递任何未更改的值?
感谢您的任何意见!
答案 0 :(得分:0)
我认为在存储新值之前检查值是否更改的最合适的位置是在解决方案的asp端,而不是在数据库中。然后,您可以将参数传递给存储过程。
在该过程中,根据该参数,您决定是否应更改该值。
修改:假设您拥有HiddenField type的服务器控件。
Page_Load(object sender, EventArgs e) {
if (IsPostBack) {
if (myTextBoxIWannaCheckForChanges.Text != myHiddenField.Value) {
// The value has changed.
}
}
}
请注意,这将检查页面加载期间的更改。您也可以在处理按钮单击时使用这种逻辑(如果这样做,则不必检查PostBack)。像这样:
foo_clicked (object sender, EventArgs args) {
SqlCommand command = // ...snip
// ... set everything you need for your command.
bool changed = (myTextBoxIWannaCheckForChanges.Text != myHiddenField.Value);
command.Parameters.AddWithValue("@changed", changed);
// ... finally let the command execute.
}
答案 1 :(得分:0)
感谢所有回复...... 最终改变前端应用程序是没有选择的,因为未来版本中的更改不会反映出它是第三方。 我尝试了大多数选项来改变SProc,但要么根本没有更新所需的字段值(即使值已更改)或更新所有时间。我决定从另一方面更深入地研究问题(为什么我希望在Value没有改变时不更新这个字段,这是一个更新触发器,只有在该字段的值实际改变时才会触发。
最后,解决方案非常简单:
看到了
IF UPDATE (RoomNo)
触发器中的并不真正比较字段的值,但仅仅是在调用了Update时,我只需要通过INSERTED和DELETED添加比较,所以我在DELETED中添加了join,在其上设置了Where Where子句它有效:)
ALTER trigger [dbo].[UpdateDepartDate]
on [dbo].[Customer]
for update
As
Begin
if update (RoomNo)
Begin
UPDATE Customer
SET [DepartDate] = null
FROM Rooms r
INNER JOIN Customer cu
ON cu.[RoomNo] = r.[Room_ID]
Join INSERTED INS
ON cu.[CU_ID] = INS.[CU_ID]
join Deleted Del
ON INS.[CU_ID] = DEL.[CU_ID]
WHERE INS.[RoomNo] <> DEL.[RoomNo]
END
END
以为我在这里发帖给任何感兴趣的人:) 再次感谢大家的帮助