2012-03-21 3 views
1

저는 테스트 중이며 아래에서 실행중인 SQL 쿼리가 있지만 매번 다른 데이터를 반환하는 것처럼 보였습니다. 내가 행했을 때 행이 다른지 확인합니다. 여러 번 실행했고 마지막 select 문은 25-32 행 사이의 어떤 부분을 반환하지만 어떻게 바뀔 수 있습니까?SQL 업데이트, 동일한 쿼리, 매번 다른 결과가 발생했습니다.

동일한 데이터를 처리하기 위해 begin tranrollback tran을 사용하고 있으며 이것이 문제가되지는 않습니다. 아무도 내가 잘못한 것을 발견 할 수 있습니까 ??

Id (Id)의 쌍인 테이블 (#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 deleteCustomerAddress 테이블에 IsPrimaryAddress의 다른 일치하는 값이 있습니다.

업데이트 단계에서 Id that is master 행의 IsPrimaryAddress은 일치하는 Id to delete 행이 새 값의 소스로 선택된 경우 1 또는 0으로 무작위로 업데이트됩니다.

+0

코스! 이것은 내가 그것을 다시 보았을 때 완벽하게 이해됩니다. 나는이 문제를 어떻게 해결할 수 있는지 또 다른 질문을 할 것이지만, 대체 사례가 '아무 것도하지 않는다'는 방법이 있는지 알고 있겠는가? 오답을주는 첫 번째 읽기가 끝나면 스스로 설정하는 것이 효과가 없다. –

0

유일한 방법, 다른 사람이 밖에서 뭔가 다른 일을한다, 또는 가능성이 열려있는 거래가 두 개 이상인 경우이 문제가 발생할 수 있습니다. 후자의 경우 및/또는 테스트하려면 열린 트랜잭션이 없다는 오류가 나타날 때까지 ROLLBACK TRAN을 실행하십시오. 처음 오류가 발생하면 열려 있지 않습니다.

+0

처음 오류가 발생했습니다. 아무도 다른 데이터베이스에 복사되었으므로 다른 사람이 데이터를 건드리지 않습니다. 지금 적어도 20-30 번 이상 달리십시오. 매번 다른 경우 ... 진행되는 문이 아직 이상하지 않은지 확인하기 위해 'go'문을 입력하십시오. –

+0

#AddressToDeleteMasterOfLesserId 테이블은 어떻습니까? #AddressToDeleteMasterOfLesserId에서 select *를 추가하고 변경 중인지 확인하십시오. –

+0

도움을 주셔서 감사합니다, 안드리가 점수를 쳤다. 데이터에 중복 된 데이터가 있으며, 데이터가 중복되면 나중에 다시 설정하는 것이 분명해 보이지만 어제 나를 거의 선반으로 몰아 넣었습니다 !! –

관련 문제