증상

id 열에 삽입된 값을 검색하기 위해 SCOPE_IDENTITY() 또는 @@IDENTITY 함수를 사용하는 경우 이러한 함수가 잘못된 값을 반환하는 경우도 있습니다. 쿼리에서 병렬 실행 계획을 사용하는 경우만 문제가 발생합니다. 쿼리에서 병렬 실행 계획을 사용할지 여부를 결정하는 방법에 대한 자세한 내용은 Microsoft Downloads에 대한 다음 기술 문서의 쿼리 내 병렬 처리 섹션을 참조하세요.

원인

Microsoft는 이 문서의 시작부에 나열된 Microsoft 제품의 문제인 것으로 확인했습니다.

해결 방법

누적 업데이트 정보

SQL Server 2008 R2 서비스 팩 1

이 문제의 수정은 2008 R2 서비스 팩 1에 대한 SQL Server 업데이트 5에서 처음 릴리스되었습니다. 이 누적 업데이트 패키지를 얻는 방법에 대한 자세한 내용은 다음 문서 번호를 클릭하여 Microsoft 기술 자료에서 문서를 볼 수 있습니다. 

26596942008 R2 서비스 팩 1의 SQL Server 업데이트 패키지 5

참고 빌드가 누적되어 있기 때문에 각 새 수정 릴리스에는 이전 버전 2008 R2 수정 릴리스에 포함된 모든 핫픽스 및 SQL Server 수정이 포함되어 있습니다. 이 핫픽스를 포함하는 최신 수정 릴리스를 적용하는 것이 좋습니다. 자세한 내용을 확인하려면 다음 문서 번호를 클릭하여 Microsoft 기술 자료 문서를 참조하십시오.

25676162008년 SQL Server 서비스 팩 1이 릴리스된 SQL Server 릴리스된 2008 R2 빌드

해결 방법

병렬 계획이 항상 신뢰할 수 있는 것은 아니기 때문에 쿼리에 이러한 함수 중 하나를 사용하지 않는 것이 좋습니다. 대신 INSERT 문의 OUTPUT 절을 사용하여 아래 예제와 같이 ID 값을 검색합니다.

OUTPUT 절을 사용하는 예:

declare @MyNewIdentityValues 테이블(myidvalues int) @A 테이블 선언(ID int 기본 키) 값에 @A 삽입(1) @B 테이블 선언(ID int 기본 키 ID(1,1), B int not null) 값에 @B 삽입(1) select     [RowCount] = @@RowCount,     [@@IDENTITY] = @@IDENTITY,     [SCOPE_IDENTITY] = SCOPE_IDENTITY() 통계 프로필 설정 에 _ddr_T 출력 inserted.ID @MyNewIdentityValues     select             b.ID         에서 @A             왼쪽 조인 @B b의 b.ID = 1             왼쪽 @B b2에서 b2를 조인합니다. B = -1             t.T = -1에서 왼쪽 _ddr_T t         존재하지 않는 위치(_ddr_T t2에서 * t2.ID = -1) 통계 프로필 끄기 설정 select     [RowCount] = @@RowCount,     [@@IDENTITY] = @@IDENTITY,     [SCOPE_IDENTITY] = SCOPE_IDENTITY(),     [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T') 에서 *를 @MyNewIdentityValues go

상황에 따라 이러한 함수 중 하나를 사용해야 하는 경우 다음 방법 중 하나를 사용하여 문제를 해결할 수 있습니다.

메서드 1:

쿼리에 다음 옵션 포함

옵션(MAXDOP 1)

참고: 쿼리의 SELECT 부분의 성능이 나을 수 있습니다.

메서드 2:

SELECT 파트에서 변수 집합(또는 단일 테이블 변수)으로 값을 읽고 MAXDOP=1을 사용하여 대상 테이블에 삽입합니다. INSERT 계획은 병렬로 처리되지 않을 것이기 때문에 올바른 시맨틱을 얻지만 SELECT는 원하는 성능을 달성하기 위해 병렬로 처리됩니다.

메서드 3:

다음 문을 실행하여 최대 병렬 처리 옵션을 1로 설정합니다.

sp_configure '최대 병렬 처리 정도', 1

go

재구성 및 재구성

go

참고: 이 메서드는 서버에서 성능 저하를 일으킬 수 있습니다. 테스트 또는 스테이징 환경에서 평가하지 않는 한 이 메서드를 사용하지 말아야 합니다.

추가 정보

이 문제의 Microsoft Connect 버그는

MAXDOP(병렬 처리)

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.