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

Откуда:
Сообщений: 62
Здравствуйте,

Я пишу хранимку для обновления строки, в параметрах хранимки новые значения для полей нужной строки.
Сейчас думаю о том, что если запись не изменилась, а я вызываю хранимку для нее, то нет смысла делать update для тех полей, которые совпадают с теми значениями, которые я хочу обновить.

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

Подскажите, пожалуйста, как мне лучше это реализовать. В какой тип сохранять запись из базы - cursor, table или вообще завести переменную для каждого поля? Как это сделать по уму?

Или мсскл умный и просто не будет делать фактическое обновление для запроса update table set f = 1 where ... если f уже равно 1?

Спасибо за советы, я теряюсь.
15 июл 11, 11:25    [10978509]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
iap
Member

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

MSSQL настолько умный, чтобы не решать за разработчика, надо апдейтить или нет.
Инструкция UPDATE может иметь часть WHERE.
Вот там-то и можно устроить проверку на равенство полей переданным параметрам.
15 июл 11, 11:30    [10978553]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
bambaruk
Member

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

т.е. получается, что если в записи двадцать полей, то надо писать двадцать апдейтов? а на производительности это не получится, что проще одним запросом тупо поверх старых значений переписать?
15 июл 11, 11:38    [10978586]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
Glory
Member

Откуда:
Сообщений: 104751
bambaruk
т.е. получается, что если в записи двадцать полей, то надо писать двадцать апдейтов?

Если внимательно изучить синтаксис Update, то можно увидеть, что список полей задается в одной команде
15 июл 11, 11:39    [10978595]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Если ВСЕ поля, соответствующие переданным параметрам, РАВНЫ значениям этих параметров, то обновлять не надо.
А если есть хоть одно отличие, то обновлять ВСЕ эти поля. Для такой ситуации WHERE должен вернуть TRUE.
Можно, конечно, применяя динамический SQL, выполнить одним UPDATEом изменение ТОЛЬКО меняющихся полей.
Но надо ли?
15 июл 11, 11:44    [10978640]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
bambaruk
Member

Откуда:
Сообщений: 62
Я наверное объясняю плохо :(

Есть запись:
a, b, c
1,2,3

вызвал процедуру: exec pUpdateTable 1,2,4

как можно понять, что обновлять надо не все три поля, а только последнее?
15 июл 11, 11:44    [10978645]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
Glory
Member

Откуда:
Сообщений: 104751
bambaruk

как можно понять, что обновлять надо не все три поля, а только последнее?

Как вы вообще определяете, какую запись надо обновлять ?
15 июл 11, 11:46    [10978658]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
bambaruk
Member

Откуда:
Сообщений: 62
iap, понял вашу мысль, спасибо :)

Glory, ну это я для примера написал. предположим, что в этой таблице всего одна запись. в жизни будет ключ передаваться, конечно.
15 июл 11, 11:53    [10978706]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
bambaruk
iap, понял вашу мысль, спасибо :)

Glory, ну это я для примера написал. предположим, что в этой таблице всего одна запись. в жизни будет ключ передаваться, конечно.
По-хорошему, надо табличную переменную с новыми значениями передавать.
Чтобы апдейтить не одну строку за раз, а мнооого!
15 июл 11, 12:03    [10978786]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
bambaruk
Member

Откуда:
Сообщений: 62
А сколько строк можно тогда передать за раз? Тысяч десять - нормально?
По идее будет гораздо быстрее, чем десять тысяч раз эту хранимку дергать?

А простенький пример не могли бы написать, просто для понимания что именно имеете в виду.
15 июл 11, 12:11    [10978841]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
Glory
Member

Откуда:
Сообщений: 104751
bambaruk
А сколько строк можно тогда передать за раз? Тысяч десять - нормально?

Передать куда ?
В exec pUpdateTable 1,2,4 ?
15 июл 11, 12:15    [10978873]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
bambaruk
А сколько строк можно тогда передать за раз? Тысяч десять - нормально?

Передать куда ?
В exec pUpdateTable 1,2,4 ?
exec pUpdateTable @NewValues;
Если SQL2008, конечно
15 июл 11, 12:22    [10978940]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по обновлению  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
exec pUpdateTable @NewValues;
Если SQL2008, конечно
Ну и процедуру переделать, разумеется.
И табличную переменную объявить и заполнить перед вызовом.
15 июл 11, 12:24    [10978962]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить