2013-05-14 99 views
0

我有一個很好的看看,但無法完全找到這個答案: 我有一個存儲過程更新SQL SERVER 2008表上的30個字段。對於我來說,其中一個字段只會更新,如果值實際發生更改對我很重要。更新值只有當更改

存儲過程片段的時刻:

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

我試圖改變它爲特定列凝聚在程序的設定條款/ ISNULL,但它仍然更新該列以及

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

兩個給我相同的輸出...

你有什麼想法如何不更新服務器端的價值或我必須把這個上的.asp論壇將應用程序更改爲不傳遞任何未更改的值?

感謝您的任何意見!

+1

你有沒有考慮使用上的數據庫表中的SQL觸發器? – 2013-05-14 13:53:11

+0

這就是爲什麼我希望特定字段不更新,如果值沒有改變 - 這個表上有一個更新觸發器,只有當這個字段更新時才觸發更新......不幸的是,它每次都觸發ANY值被改變表...任何想法? – user2312782 2013-05-14 15:01:04

回答

0

我認爲在存儲新值之前檢查值是否改變的最合適的地方是解決方案的asp側,而不是數據庫中。然後你可以傳遞一個參數給存儲過程。

在該過程中,根據該參數決定是否應該更改該值。

編輯:假設您有一個服務器控制HiddenField type

Page_Load(object sender, EventArgs e) { 
    if (IsPostBack) { 
     if (myTextBoxIWannaCheckForChanges.Text != myHiddenField.Value) { 
      // The value has changed. 
     } 
    } 
} 

請注意,這將檢查頁面加載期間的更改。你也可以在處理按鈕點擊時使用這種邏輯(如果你這樣做,你不必檢查回傳)。就像這樣:

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. 
} 
+0

這方面的任何建議?我對.asp並不是很在意,它是第三方軟件 - 任何建議,在ButtonClick Stuff中尋找限制保存操作的地方都將受到高度讚賞:) – user2312782 2013-05-14 12:42:11

+0

我很遺憾地使用傳統的ASP,很抱歉。如果它是ASP.NET,則可以比較帖子之間的字段值以查看它們是否已更改。 – Renan 2013-05-14 12:45:44

+0

你也可以嘗試一些JavaScript和jQuery。 $(「id」)。change(function)'只會在引用id的元素的值改變時調用該函數。 – Renan 2013-05-14 12:46:52

0

感謝所有答覆... 更改前端應用中是到底有沒有選擇,因爲變化不會在未來版本中看到它的第三方體現。 我嘗試了大多數選項來改變SProc,但要麼沒有得到所需更新的字段值(即使值更改)或更新所有時間。我決定從另一方面考慮更多的問題(爲什麼我希望這個字段在值沒有改變時不被更新,這是一個Update-Trigger,只有當該字段的值實際發生改變時纔會觸發。

最終,該解決方案是非常簡單的:

眼見

IF UPDATE (RoomNo) 
在觸發

並沒有真正比較字段​​的值,而只是如果有所謂的更新,我只需通過INSERTED和DELETED添加比較,所以我添加了DELETED連接,並在其上設置了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 

以爲我張貼在這裏,有興趣的人士:) 再次感謝大家的幫助