0

我环顾四周,但找不到答案:我得到了一个存储过程,它更新了 SQL SERVER 2008 表上的大约 30 个字段。对我来说重要的是,如果值实际发生变化,其中一个字段只会更新。

目前的存储过程片段:

ALTER PROCEDURE test
@p_RoomNo int,
[RoomNo] = @p_RoomNo,

我尝试在过程的 SET 子句中将该特定列更改为 COALESCE / ISNULL,但它仍然更新该列

[RoomNo] = COALESCE(@p_RoomNo,RoomNo),
[RoomNo] = ISNULL(@p_RoomNo,RoomNo),

两者都给我相同的输出...

您是否有任何想法如何不更新服务器端的值,或者我是否必须将其放在 .asp-Forum 上以更改应用程序以不传递任何未更改的值?

感谢您的任何意见!

4

2 回答 2

0

我认为在存储新值之前检查值是否更改的最合适的位置是在解决方案的 asp 端,而不是在数据库中。然后您可以将参数传递给存储过程。

在该过程中,根据该参数,您决定是否应该更改该值。

编辑:假设您有一个HiddenField 类型的服务器控件。

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.
}
于 2013-05-14T12:30:27.247 回答
0

感谢所有回复...最终无法更改前端应用程序,因为更改不会反映在未来版本中,因为它是第 3 方。我尝试了大多数选项来更改 SProc,但要么根本没有更新所需的字段值(即使值已更改),要么一直在更新。我决定从另一边更多地研究这个问题(为什么我希望在值没有改变时不更新这个字段,这是一个更新触发器,它应该只在该字段的值实际改变时触发。

最后,解决方案非常简单:

看到那个

IF UPDATE (RoomNo)

在触发器中并没有真正比较字段​​的值,而只是如果调用了更新,我只需通过插入和删除添加比较,所以我添加了删除的连接,在它上面设置了我的 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

以为我把它贴在这里给任何有兴趣的人:) 再次感谢大家的帮助

于 2013-05-15T11:31:58.807 回答