Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
jnub Member Откуда: Сообщений: 32 |
Есть апдейт с join'ом, который по ряду причин приводит к появлению в наборе новых значений для обновляемой таблицы нескольких значений для одной строки. Выглядит это так: SET NOCOUNT ON BEGIN TRAN -- Обновляемая строка DECLARE @T TABLE (id INT, v INT) INSERT @T VALUES (1, 10) SELECT * FROM @t -- Варианты значений для обновления DECLARE @S TABLE (id INT, A INT) INSERT @S SELECT 1, -999 UNION ALL SELECT 1, 100 SELECT * FROM @T T, @S S WHERE S.id = T.id -- Апдейт на основе предыдущего значения UPDATE @T SET v = v + S.A FROM @T T, @S S WHERE S.id = T.id -- Результат SELECT * FROM @t ROLLBACK GO id v ----------- ----------- 1 10 id v id A ----------- ----------- ----------- ----------- 1 10 1 -999 <<<<<<<<<<<<<< 1 10 1 100 <<<<<<<<<<<<<< id v ----------- ----------- 1 110 <<<<<<<<<<<<<< Как видно из результата, в апдейт пошло только второе значение (100) из двух возможных (100, -999).
Вопрос в чем - я правильно понимаю, что ANY возвращает любое (непредсказуемое) значение? Microsoft SQL Server 2000 - 8.00.2066 (Intel X86) |
12 мар 13, 12:36 [14039592] Ответить | Цитировать Сообщить модератору |
Гость333 Member Откуда: Сообщений: 3683 |
jnub, Вы правильно понимаете.
Ну и в старших версиях — то же самое. Кстати, в версиях 2005 и 2008R2 ваш скрипт вернул -989. Вот она, непредсказуемость в действии. |
||
12 мар 13, 12:47 [14039668] Ответить | Цитировать Сообщить модератору |
EvAlex Member Откуда: Israel Сообщений: 1001 |
Кстати в 2008 - MERGE которым лучше воспользоваться в этом случае (имхо). Вернёт ошибку. |
12 мар 13, 12:55 [14039736] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
|
||
12 мар 13, 13:15 [14039866] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31780 |
Нужно использовать такой запрос, который нужен для бизнес-логики. В данном случае - "обновить любым значением". |
||
12 мар 13, 13:17 [14039880] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Ибо он не собирается хранить и обрабатывать данные. А только мусор. |
||||
12 мар 13, 13:21 [14039907] Ответить | Цитировать Сообщить модератору |
jnub Member Откуда: Сообщений: 32 |
В целом согласен. Вот, налетели на такую проблему (по семантике предполагалось, что некий запрос будет возвращать однозначный набор, и никаких проверок на этот счет не было). Наверное, было бы здорово, если бы сервер как-то индицировал такие ситуации, предупреждая криворукость, а не записывал "что попало" :) С другой стороны, как бы это теоретически сказалось на производительности - это вопрос |
||||
12 мар 13, 16:31 [14041355] Ответить | Цитировать Сообщить модератору |
EvAlex Member Откуда: Israel Сообщений: 1001 |
Вот имено этим и лучше - пусть будет ошибка и реакция\исправление, чем неизвестное значение, которое пойди пойми откуда появилось. |
12 мар 13, 17:52 [14041836] Ответить | Цитировать Сообщить модератору |
=)8-)
Guest |
А всего-то хотелось аналогаselect @text += field from tableятд:)) |
13 мар 13, 09:19 [14043450] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |