Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 update в хранимой процедуре  [new]
QuiGon
Member

Откуда:
Сообщений: 10
Есть таблица Izdelia с полями
ID_Izdelia (PK)
ID_Zakaz
ID_Indeks
Shifr

Все поля NOT NULL

Хранимой процедуре Izdelia_Update в качестве параметров передается ID_Izdelia - т.е. id-шник строки, которую нужно обновить, + параметры с новыми значениями полей. Обновляться может как одно поле в строке, так и несколько.

Суть в том, что процедура должна быть универсальной, т.е должна проверять входные параметры на NULL и в зависимости от этого обновлять нужные поля. Если входные параметры @ID_Zakaz и @ID_Indeks IS NULL,а параметр @Shifr IS NOT NULL => SET Shift=@Shifr

Пришел к такому решению:
CREATE PROCEDURE Izdelia_Update
AS
UPDATE Izdelia
SET
  ID_Zakaz = CASE WHEN @ID_Zakaz IS NOT NULL THEN @ID_Zakaz ELSE ID_Zakaz END,
  ID_Indeks = CASE WHEN @ID_Indeks IS NOT NULL THEN @ID_Indeks ELSE ID_Indeks END,
  Shifr = CASE WHEN @Shifr IS NOT NULL THEN @Shifr ELSE Shifr END
WHERE ID_Izdelia=@ID_Izdelia

Проблема в том, если убрать ELSE, то в строку почему-то записываются NULL. А так получается в поле перезаписывается старое значение - лишняя операция.

Может есть более изящное решение проблемы? Или как хотя бы от лишней операции перезаписывания избавиться?
17 июн 14, 18:42    [16177945]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
QuiGon
Проблема в том, если убрать ELSE, то в строку почему-то записываются NULL.

А что должно записываться, если возвращается NULL ?

QuiGon
Может есть более изящное решение проблемы?

Не делать процедуру универсальной. Что передал пользователь, то и записывать
17 июн 14, 18:46    [16177957]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
QuiGon
Member

Откуда:
Сообщений: 10
Glory
А что должно записываться, если возвращается NULL ?

Если NULL, то ничего не должно записываться. В поле остается старое значение.

Glory
Не делать процедуру универсальной. Что передал пользователь, то и записывать

Процедура должна быть одна, такие требования со стороны приложения, в котором это дело будет использоваться.
Можно, конечно, внутри процедуры написать несколько update'ов на каждый случай. Но есть другие таблицы в базе с большим количеством полей, к которым тоже нужны подобные процедуры.
17 июн 14, 18:54    [16177984]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Какая разница, будет перезаписана вся запись по условию
автор
WHERE ID_Izdelia=@ID_Izdelia


Добавьте в исключения те, у которых все три поля NULL, для разнообразия...
17 июн 14, 18:55    [16177993]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
edyaN
Member

Откуда:
Сообщений: 185
SET ID_ZAKAZ = ISNULL(@ID_ZAKAZ, ID_ZAKAZ)

но лучше послушайтесь предыдущего оратора
17 июн 14, 18:56    [16177997]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
QuiGon
Если NULL, то ничего не должно записываться. В поле остается старое значение

Это по каким стандартам ?
И как я тогда смогу занести NULL в поле ?

QuiGon
Процедура должна быть одна, такие требования со стороны приложения, в котором это дело будет использоваться.
Можно, конечно, внутри процедуры написать несколько update'ов на каждый случай. Но есть другие таблицы в базе с большим количеством полей, к которым тоже нужны подобные процедуры.

Нельзя получить все сразу и бесплатно.
17 июн 14, 18:56    [16178001]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
QuiGon
Member

Откуда:
Сообщений: 10
Glory
Это по каким стандартам ?
И как я тогда смогу занести NULL в поле ?

В данном конкретном случае все поля таблиц NOT NULL

Glory
Нельзя получить все сразу и бесплатно.

Не спорю)
17 июн 14, 19:01    [16178022]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
QuiGon
В данном конкретном случае все поля таблиц NOT NULL

И поэтому UPDATE должен игнорировать NULL-ы ?
17 июн 14, 19:04    [16178034]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
QuiGon,

тогда поставьте проверку на is null для трех переменных. Или Вы думаете, что сервер производит запись для каждого поля отдельной операцией?
17 июн 14, 19:07    [16178044]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
QuiGon
Member

Откуда:
Сообщений: 10
Владислав Колосов,
нет. насколько я понимаю одна запись - одна операция
17 июн 14, 19:13    [16178066]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
QuiGon, вот Вы сами и дали ответ о целесообразности изменения кода.
17 июн 14, 19:16    [16178076]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
QuiGon
Member

Откуда:
Сообщений: 10
Glory
QuiGon
В данном конкретном случае все поля таблиц NOT NULL

И поэтому UPDATE должен игнорировать NULL-ы ?

В общем да. Вместо NULL можно передать специальные значения и делать проверку на них, например: пришло 'not_update' поле не надо менять, иначе обновить. Но у полей разные типы данных, для числовых придется свое значение изобретать..
17 июн 14, 19:18    [16178081]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
QuiGon
В общем да. Вместо NULL можно передать специальные значения и делать проверку на них, например: пришло 'not_update' поле не надо менять, иначе обновить. Но у полей разные типы данных, для числовых придется свое значение изобретать..

Ваш стандарты не совпадают со стандартами MS SQL.
17 июн 14, 19:19    [16178083]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
QuiGon
Member

Откуда:
Сообщений: 10
Владислав Колосов
QuiGon, вот Вы сами и дали ответ о целесообразности изменения кода.

Да, спасибо за наводку) тупанул
17 июн 14, 19:20    [16178085]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
QuiGon
Member

Откуда:
Сообщений: 10
Glory
QuiGon
В общем да. Вместо NULL можно передать специальные значения и делать проверку на них, например: пришло 'not_update' поле не надо менять, иначе обновить. Но у полей разные типы данных, для числовых придется свое значение изобретать..

Ваш стандарты не совпадают со стандартами MS SQL.

А можно подробней?
Опыта мало. весьма вероятно, что чего-то не знаю или не так делаю
17 июн 14, 19:22    [16178087]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
QuiGon
А можно подробней?
Опыта мало. весьма вероятно, что чего-то не знаю или не так делаю

Сервер не должен сам подменять переданые ему значения или игнорировать команды
Иначе это будет не сервер, а искусственный разум.
17 июн 14, 19:26    [16178095]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
QuiGon
Member

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

Логично. Поэтому и решил спросить здесь. Может в синтаксисе где ошибся, или не так что сделал
17 июн 14, 19:34    [16178108]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
QuiGon,

UPDATE Izdelia
SET
  ID_Zakaz = isnull( @ID_Zakaz ,ID_Zakaz ),
  ID_Indeks = isnull(@ID_Indeks , ID_Indeks ),
  Shifr = isnull( @Shifr , Shifr )
WHERE 
   ID_Izdelia=@ID_Izdelia
   and
   (@ID_Zakaz  is not null or @ID_Indeks is not null or @Shifr is not null)
18 июн 14, 10:11    [16180095]     Ответить | Цитировать Сообщить модератору
 Re: update в хранимой процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
QuiGon
Может в синтаксисе где ошибся, или не так что сделал

Вы ошиблись в логике
18 июн 14, 10:13    [16180110]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить