2010-04-27 124 views
2

我需要爲數據庫中的每個表提供4個MySQL存儲過程。它們用於獲取,更新,插入和刪除。 「獲取」,「刪除」和「插入」很簡單。問題是「更新」,因爲我不知道哪些參數將被設置,哪些不是。一些參數可以設置爲NULL,其他參數不會改變,因此不會提供。從XML更新記錄

由於我已經在使用XML,在Google中進行了多次搜索之後,我發現可以使用名爲UpdateXML的函數,但這些示例太複雜,一些文章從2007年開始。因此,我不知道現在是否有更好的技術或更容易的方法。

任何評論,文檔,鏈接,文章或任何東西,你已經使用和你滿意,將十分讚賞:d

乾杯。

回答

1

通常,當您在前端的數據庫中有一行數據時,應該有用於更新數據庫中該行的所有值。您應該將所有這些值傳遞到您的更新中,而不管它們是否實際更改。否則,你的數據庫並不真正知道它是否獲得了一個列的NULL值,因爲這就是它應該是的,或者因爲你只是沒有傳遞真正的值。

如果您要在應用程序的某些區域不需要表中的某些列,那麼可以設置不使用這些列的其他存儲過程。在填充前端對象時,從數據庫中檢索所有列通常更容易。額外列的開銷通常很小,值得保存多個更新存儲過程的維護。

下面是一個例子。這是MS SQL Server語法,所以你可能需要稍微改變它,但希望它描述了一個思路:

CREATE PROCEDURE Update_My_Table 
    @my_table_id INT, 
    @name   VARCHAR(40), 
    @description VARCHAR(500), 
    @some_other_col INT 
AS 
BEGIN 
    UPDATE 
     My_Table 
    SET 
     name   = @name, 
     description = @description, 
     some_other_col = @some_other_col 
    WHERE 
     my_table_id = @my_table_id 
END 

CREATE PROCEDURE Update_My_Table_Limited 
    @my_table_id INT, 
    @name   VARCHAR(40), 
    @description VARCHAR(500) 
AS 
BEGIN 
    UPDATE 
     My_Table 
    SET 
     name   = @name, 
     description = @description 
    WHERE 
     my_table_id = @my_table_id 
END 

正如你所看到的,只是消除,你不更新這些列來自UPDATE語句。只是不要過分,並嘗試爲每個可能需要更新的列組合使用存儲過程。從表中選擇時,從數據庫中獲取額外的列要容易得多。您最終會傳回相同的值,並且您的服務器將以相同的確切值更新列,但這沒什麼大不了的。您可以對您的前端進行編碼,以確保在實際嘗試更新數據庫中的任何內容之前至少有一列已更改。