SQL Update, один и тот же запрос, каждый раз разные результаты - PullRequest
1 голос
/ 21 марта 2012

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

Я использую 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

Ответы [ 2 ]

1 голос
/ 21 марта 2012

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

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

0 голосов
/ 21 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...