2009-04-17 70 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)