2009-04-17 66 views
1

假設我有如下表SQL存儲過程比較值

book 
----- 
id 
name 
genre 
check_out_date 
location_id 

任何人都可以發佈一個高效的存儲過程,只有更新的書表,其中的價值觀傳遞是從當前的值不同的例子表?

即如果我傳入值(1,「屠宰場V」,「小說」,10/10/2008,54) 和表中的值是(1,「屠宰場V,」小說「,10/24/2009年,70), 它只會提前更新CHECK_OUT_DATE和LOCATION_ID列。

Update Book set [email protected]_out_date (10/24/2009), [email protected]_id (70). 

感謝

回答

0

最有效的辦法是讓你的比較,在BL或者可能是DAL,並在那裏作出更新或不作出決定

如果您知道這是一個不是插入的更新,您可能正在讀取記錄。還有可能還有其他驗證。把它全部放在一個地方。

2
UPDATE book 
SET name = @name, 
    genre = @genre, 
    check_out_date = @check_out_date, 
    location_id = @location_id 
FROM BOOK 
WHERE (id = @id) AND 
    (((@name IS NULL AND name IS NOT NULL) OR 
     (@name IS NOT NULL AND name IS NULL) OR 
     (@name IS NOT NULL AND name IS NOT NULL AND name <> @name)) OR 
     ((@genre IS NULL AND genre IS NOT NULL) OR 
     (@genre IS NOT NULL AND genre IS NULL) OR 
     (@genre IS NOT NULL AND genre IS NOT NULL AND genre <> @genre)) OR 
    ((@check_out_date IS NULL AND check_out_date IS NOT NULL) OR 
     (@check_out_date IS NOT NULL AND check_out_date IS NULL) OR 
     (@check_out_date IS NOT NULL AND check_out_date IS NOT NULL AND 
     check_out_date <> @check_out_date)) OR 
    ((@location_id IS NULL AND location_id IS NOT NULL) OR 
     (@location_id IS NOT NULL AND location_id IS NULL) OR 
     (@location_id IS NOT NULL AND location_id IS NOT NULL AND 
     location_id <> @location_id))) 
+0

您可能需要進行空檢查,但可能會過大。 – 2009-04-17 03:49:46

+1

只需要警告,這不會更新任何那些列值爲空或任何參數值爲空的任何行(這意味着如果任何參數爲空,則將更新任何行) – 2009-04-17 03:50:01

+0

@Charles和@Adam:挑剔,挑剔...... ;-) – 2009-04-17 04:06:43

1

您可能不想這樣做,但您也可以先使用匹配的ID刪除記錄,然後再次插入它。

0

你說過一個存儲過程,所以沒有理由不保持它簡單並做單獨的更新。

UPDATE book SET name = @name WHERE id = @id and name <> coalesce(@name,name) 
UPDATE book SET genre = @genre WHERE id = @id and genre <> coalesce(@genre,genre) 
UPDATE book SET check_out_date = @check_out_date WHERE id = @id and check_out_date <> coalesce(@check_out_date,check_out_date) 
UPDATE book SET location_id WHERE id = @id and location_id <> coalesce(@location_id,location_id)