증상
Microsoft SQL Server 2016 또는 2017을 사용하고 있다고 가정합니다. wheres 문과 함께 메모리 최적화 테이블 변수를 사용하여 메모리 최적화 데이터 트랜잭션을 처리하는 경우 잘못된 결과가 발생할 수 있습니다.
예는 다음과 같습니다.
1단계: 메모리 최적화 데이터베이스 및 테이블을 만듭니다.
DATABASE 데모 만들기
ALTER DATABASE 데모 ADD FILEGROUP demo_mod CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE 데모 ADD FILE(name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
데모 사용
이동
CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE AS TABLE
( source_col INT NULL,
NULL이 아닌 INT target_col
INDEX ix_InMemoryTable 비클러스터형(target_col)
) WITH(MEMORY_OPTIMIZED = ON)
이동
2단계: 데이터를 삽입하고 데이터를 업데이트합니다.
DECLARE @t dbo. IN_MEMORY_TABLE_TYPE
INSERT @t( source_col, target_col ) VALUES(10, 0),(0, 0)
@t * 선택
UPDATE r1 SET target_col = -1 FROM @t r1
WHERE EXISTS( SELECT * FROM @t r2 WHERE r2.source_col > 0 )
SELECT * FROM @t
이동
3단계: 결과를 확인합니다.
실제 결과: 테이블 변수의 모든 행이 업데이트되지 @t .
source_col | target_col
----------------------
10 | -1
0 | 0
예상 결과: 모든 행이 업데이트되어야 target_col = -1입니다.
source_col | target_col
----------------------
10 | -1
0 | -1.
해결 방법
이 문제는 SQL Server 대한 다음 누적 업데이트에서 해결되었습니다.
SQL Server 대한 각각의 새로운 누적 업데이트에는 이전 누적 업데이트에 포함된 모든 핫픽스 및 모든 보안 수정 사항이 포함됩니다. SQL Server 대한 최신 누적 업데이트를 확인하세요.
상태
Microsoft는 "적용 대상" 절에 나열한 제품에서 이 문제를 확인했습니다.
참고 자료
Microsoft에서 소프트웨어 업데이트를 설명하는 데 사용하는 용어에 대해 알아봅니다.