SQL Server에 흥미로운 문제가 발생했습니다. 다음 재현 예제를 고려하십시오.
CREATE TABLE #test (s_guid uniqueidentifier PRIMARY KEY);
INSERT INTO #test (s_guid) VALUES ('7E28EFF8-A80A-45E4-BFE0-C13989D69618');
SELECT s_guid FROM #test
WHERE s_guid = '7E28EFF8-A80A-45E4-BFE0-C13989D69618'
AND s_guid <> NEWID();
DROP TABLE #test;
s_guid <> NEWID()
조건이 완전히 쓸모없는 것처럼 보이는 것을 잊지 마십시오 . 이것은 최소한의 재현 사례입니다. NEWID()
주어진 상수 값 을 일치 시킬 확률 은 매우 작으므로 매번 TRUE로 평가해야합니다.
그러나 그렇지 않습니다. 이 쿼리를 실행하면 보통 1 개 행을 돌려줍니다 만, 때때로 (매우 자주, 10 명 중 1 개 이상 시간) 0 행을 반환합니다. 시스템에서 SQL Server 2008을 사용하여이를 재현했으며 위에 링크 된 바이올린 (SQL Server 2014)을 사용하여 온라인으로이를 재현 할 수 있습니다.
실행 계획을 보면 쿼리 분석기가 분명히 조건을 s_guid < NEWID() OR s_guid > NEWID()
다음과 같이 나눕니다 .
... 때때로 실패하는 이유를 완전히 설명합니다 (첫 번째로 생성 된 ID가 작고 두 번째 ID가 주어진 ID보다 큰 경우).
SQL Server를 평가하기 위해 허용 A <> B
과 같은 A < B OR A > B
표현 중 하나가 비 결정적 경우에도? 그렇다면 어디에 기록되어 있습니까? 아니면 버그를 찾았습니까?
흥미롭게도 AND NOT (s_guid = NEWID())
동일한 실행 계획 (및 동일한 임의의 결과)을 산출합니다.
개발자가 선택적으로 특정 행을 제외하고 싶을 때이 문제를 발견했습니다.
s_guid <> ISNULL(@someParameter, NEWID())
"바로 가기"로 :
(@someParameter IS NULL OR s_guid <> @someParameter)
버그에 대한 설명서 및 / 또는 확인을 찾고 있습니다. 코드가 모두 관련이있는 것은 아니므로 해결 방법이 필요하지 않습니다.