2012-03-21 4 views
1

У меня есть SQL-запрос, который я тестирую, и работает как показано ниже, но я заметил, что каждый раз он возвращал разные данные, тогда я понял, что он даже возвращал разное количество строк, когда я проверяю, сработало ли это! Я запустил его несколько раз, и окончательный оператор select вернется где-то между 25-32 строками, но как это может измениться?SQL Update, тот же запрос, разные результаты каждый раз

Я использую begin tran и rollback tran для работы над одними и теми же данными и не считаю, что это проблема. Может ли кто-нибудь определить, что я сделал неправильно?

Он работает на столе (#AddressToDeleteMasterOfLesserId), который является парами идентификаторов и устанавливает флаг (IsPrimaryAddress) на адрес клиента, если он существует в таблице, а в его паре установлен флаг. #AddressToDeleteMasterOfLesserId уже определен и не изменяется.

begin tran t1 

    select CustomerAddress.IsPrimaryAddress, p1.[Id that is master],p1.[Id to delete], c2.IsPrimaryAddress 
    FROM CustomerAddress 
    join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master] 
    join CustomerAddress c2 on p1.[Id to delete]=c2.Id 
    order by [Id that is master] 

    --Update primary address 
    UPDATE CustomerAddress 
    SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END 
    FROM CustomerAddress 
    join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master] 
    join CustomerAddress c2 on p1.[Id to delete]=c2.Id 

    select CustomerAddress.IsPrimaryAddress, p1.[Id that is master],p1.[Id to delete], c2.IsPrimaryAddress 
    FROM CustomerAddress 
    join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master] 
    join CustomerAddress c2 on p1.[Id to delete]=c2.Id 
    where CustomerAddress.IsPrimaryAddress=0 
    and c2.IsPrimaryAddress=1 
    order by [Id that is master] 

    rollback tran t1 

ответ

1

Вашего #AddressToDeleteMasterOfLesserId стола должен быть проведение некоторых пар, где же Id that is master сопряжен с более чем одним Id to delete и те Ids to delete имеют разные значения согласования IsPrimaryAddress в CustomerAddress таблицы.

На этапе обновления, например Id that is master Роу IsPrimaryAddress обновляется случайным образом с 1 или 0, в зависимости от которого соответствующего Id to delete строки получает выбрано, чтобы быть источником нового значения.

+0

КУРС !!!! Теперь это имеет прекрасный смысл, когда я снова смотрю на него. Я задам еще один вопрос, как я могу обойти это, но знаете ли вы, есть ли способ, чтобы альтернативный случай «ничего не делал», настройка для себя не работает, поскольку он отключает первое чтение, которое дает неправильный ответ –

0

Единственный способ, что это не приведет к той же продукции на каждом прогоне будет что либо вы делаете что-то еще за пределами этого, кто-то делает что-то еще за пределами этого, или есть возможность это может стать неудобным, если у вас есть несколько открытых транзакций. Если это последний и/или проверить его, просто запустите ROLLBACK TRAN, пока не получите сообщение об отсутствии открытых транзакций. Если вы получите ошибку в первый раз, тогда у вас не было открытого.

+0

Получил ошибку первый раз, никто другой не трогает данные, поскольку все они были скопированы в отдельную базу данных, поэтому я мог бы играть с ней. Запустили его по крайней мере 20-30 раз, каждый раз каждый раз ... каждый раз отправляйте заявления 'go', чтобы убедиться, что это не какая-то странная вещь времени, все еще происходит ... –

+0

Как насчет вашей таблицы #AddressToDeleteMasterOfLesserId. Добавьте в них выбор * из #AddressToDeleteMasterOfLesserId и посмотрите, меняется ли это. –

+0

Спасибо за помощь, но Андрю ударил в знак. В данных есть дубликаты, и когда они ударяют их, они отбрасывают их назад, кажется таким очевидным сейчас, но почти вчера меня отвезли на уступ! –

Смежные вопросы