Хранимая процедура SQL Сравнение значений - PullRequest
1 голос
/ 17 апреля 2009

Предположим, у меня есть следующая таблица

book
-----
id
name
genre
check_out_date
location_id

Может ли кто-нибудь опубликовать пример эффективной хранимой процедуры, которая обновляет только таблицу книги, в которой переданные значения отличаются от текущих значений в таблице?

т.е. если я передал значения (1, «Скотобойня V», «Художественная литература», 10/10/2008, 54) и значения в таблице: (1, «Скотобойня V», «Художественная литература», 24.10.2009, 70), он будет обновлять только столбцы check_out_date и location_id.

Update Book set check_out_date=@check_out_date (10/24/2009), location_id=@location_id (70).

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 17 апреля 2009
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)))
1 голос
/ 17 апреля 2009

Возможно, вы не захотите это делать, но вы также можете сначала УДАЛИТЬ запись с соответствующим идентификатором, а затем ВСТАВИТЬ ее снова.

0 голосов
/ 18 апреля 2009

Вы сказали, что хранимая процедура, поэтому нет причин не упрощать ее и делать отдельные обновления.

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)
0 голосов
/ 17 апреля 2009

Наиболее эффективным вариантом было бы сделать сравнение в BL или, возможно, DAL и принять решение об обновлении или нет.

Возможно, вы все равно читаете запись, если знаете, что это обновление, а не вставка. И, возможно, есть и другая проверка. Обращайтесь со всем этим в одном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...