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

Откуда:
Сообщений: 8768
Столкнулся с такой задачей: есть UPDATE c несколькими условиями в WHERE, если UPDATE вернул 0 строк (ничего не нашел) надо понять почему , т.е. какое условие "отбило".
Вот упрощенный сильно пример, который не работает:
  declare @p int =0;
  
  update [Table_1]
  SET b=-1
  select @p=111
  from Table_1 where a>10
    print @p
@p будет 0, хотя явно присваиваю 111. @@rowcount = 0.
Помогите решением...
29 ноя 11, 17:12    [11679207]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
netivan
Member

Откуда:
Сообщений: 8768
на всякий случай:
a	b
1	-1
1	-1
1	-1
2	-1
2	-1
2	-1
29 ноя 11, 17:13    [11679217]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
netivan
Member

Откуда:
Сообщений: 8768
в посте ошибка, запрос:
  update [Table_1]
  SET b=-10,@p=111
  from Table_1 where a>10
  print @p
29 ноя 11, 17:14    [11679226]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
grigrim
Member

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

попробуйте заменить условие на where a>1. Сразу заметите разницу. Или можно воспользоваться Output'ом.
29 ноя 11, 17:38    [11679369]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
netivan
Member

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

ну понятно, потому что там там он найдет строки. Впринципе с точки зрения SQL все логично. А с output сейчас помыслю
29 ноя 11, 17:44    [11679405]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
netivan
@p будет 0, хотя явно присваиваю 111. @@rowcount = 0.
Помогите решением...

И как по-вашему произойдет присвоение @p=111, если ни для одной записи этот запрос не сработал ?

netivan
Столкнулся с такой задачей: есть UPDATE c несколькими условиями в WHERE, если UPDATE вернул 0 строк (ничего не нашел) надо понять почему , т.е. какое условие "отбило".

А еще многие хотят знать заранее, сколько записей вернет их запрос
Вам всего лишь нужно будет выполнить запроса со всеми комбинациями ваших условий
29 ноя 11, 17:47    [11679431]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
netivan
Member

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

ну реальный запрос сложнее, там делается UPDATE с JOINом другой таблице, в которой прописаны некоторые ограничения. Т.е. смысл в том, что если мы получили ограничения и они не подходят, то надо понять какое именно не сработало.
29 ноя 11, 17:50    [11679473]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
netivan
Т.е. смысл в том, что если мы получили ограничения и они не подходят, то надо понять какое именно не сработало.

Ну так выполните select-ы со всеми комбинациями ваших ограничений и узнаете
29 ноя 11, 17:52    [11679487]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
netivan
Т.е. смысл в том, что если мы получили ограничения и они не подходят, то надо понять какое именно не сработало.
Это в принципе невозможно.

"Не подходит" именно общее условие, а не какая то его часть.

Например, условие
update [Table_1]
SET b=-10,@p=111
from Table_1 
where a>10 and a<10 
a>10 подходит, a<10 тоже, а вместе никак.
29 ноя 11, 17:56    [11679502]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
netivan
Member

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

это то понятно, но после SELECT-a параллельная транзакция поменять может данные и тогда его результат мягко говоря некорректен. Сделать одну большую транзакцию с УИ Serialize нельзя - буду тормоза. Вообщем хотим и рыбку съесть и ...
29 ноя 11, 17:58    [11679514]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
Glory
Member

Откуда:
Сообщений: 104751
netivan
это то понятно, но после SELECT-a параллельная транзакция поменять может данные и тогда его результат мягко говоря некорректен. Сделать одну большую транзакцию с УИ Serialize нельзя - буду тормоза. Вообщем хотим и рыбку съесть и ...

Вот и непонятно, для чего это нужно
Пользователь не знает, что хочет обновлять ?
Рисуйте ему интерфейс, где после ввода каждого нового ограничения будет делаться подсчет числа записей
29 ноя 11, 18:01    [11679529]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
netivan
Сделать одну большую транзакцию с УИ Serialize нельзя - буду тормоза.
Какоето непонятное повальная боязнь Serialize. Почему? (это я не к тому когда реаьлно всё плохо, что редкость, я про само отношение)

netivan
параллельная транзакция поменять может данные
Подход наплевательского отношения к целостности чреват. Надо перепроктировать, я не менять отношение (законы физики не поменять и не обойти).
Практически все проблемы с локировками решаются сменой порядка. От локального порядка операций, до глобального порядка работы с данными вплоть до уровня клиента (целостность достигается совершенно другой цепочкой изменений).

Мне непонятно как можно двести решение задачи до такого, что:
1. Парралельные операции могут нарушить атомарные изменения.
2. Неоднозначно понятно/известно почему в том или ином запросе @@RowCount вернул нуль/не то что нужно.

Вот давайте рассмотрим вашу задачу подробнее, а не коня в вакууме.
30 ноя 11, 10:56    [11681742]     Ответить | Цитировать Сообщить модератору
 Re: как определить какое ограничение не сработало в Update  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
netivan
Столкнулся с такой задачей: есть UPDATE c несколькими условиями в WHERE, если UPDATE вернул 0 строк (ничего не нашел) надо понять почему , т.е. какое условие "отбило".


Кому надо? Вам для спортивного интересу?
Или пользователю? Только что он с этим знанием будет делать? Пока он будет понимать почему строки не обновились (кстати сколько их: одна, десятки, сотни?) кто-то сделает еще один UPDATE и тогда чего?
Короче, огласите реальную задачу, а не хотелки.
1 дек 11, 01:00    [11687009]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить