SQL Server 2016의 "저장 프로시저가 대상 테이블의 스키마를 변경했기 때문에 INSERT EXEC 실패" 오류
이 문서는 쿼리 데이터 저장소 기능을 사용하는 데이터베이스의 저장 프로시저가 주기적으로 실패하기 때문에 발생하는 문제를 해결하는 데 도움이 됩니다.
원래 제품 버전: SQL Server 2016
원래 KB 번호: 4465511
증상
다음 시나리오를 살펴 보십시오.
쿼리 데이터 저장소 기능을 사용하는 Microsoft SQL Server 2016 데이터베이스가 있습니다.
구문을 사용하여 다른 저장 프로시저를 호출하는 저장 프로시저가
INSERT...EXEC
있습니다.쿼리 데이터 저장소 기능은 구성된 최대 크기로 증가함에 따라 자동 정리를 주기적으로 실행합니다. 또한 쿼리 데이터 저장소 상태는 .로
READ_WRITE
변경됩니다READ_ONLY
.
이 시나리오에서는 부모 저장 프로시저 실행이 주기적으로 실패하고 다음과 유사한 오류 메시지가 표시됩니다.
Msg 556, Level 16, State 2, Line LineNumber
저장 프로시저가 대상 테이블의 스키마를 변경했기 때문에 INSERT EXEC가 실패했습니다.
원인
자동 정리 프로세스는 쿼리 데이터 저장소에서 계획을 플러시합니다. 쿼리 데이터 저장소에서 계획이 누락되었으므로 쿼리에서 다시 컴파일 작업이 발생합니다. 그러나 이 계획은 프로시저 캐시에 여전히 존재합니다. 기본적으로 다시 컴파일 작업이 발생할 때 SQL Server는 자식 프로시저의 중복 실행을 방지하기 위해 오류 556을 throw합니다. 이러한 중복 작업으로 인해 잘못된 결과가 반환됩니다.
해결
SQL Server 2016에 대한 서비스 팩 정보
이 문제는 SQL Server에 대한 다음 서비스 팩에서 해결되었습니다.
SQL Server용 서비스 팩 정보:
서비스 팩은 누적됩니다. 각 새 서비스 팩에는 이전 서비스 팩에 있는 모든 수정 사항과 새 수정 사항이 포함되어 있습니다. 최신 서비스 팩과 해당 서비스 팩에 대한 최신 누적 업데이트를 적용하는 것이 좋습니다. 최신 서비스 팩을 설치하기 전에 이전 서비스 팩을 설치할 필요가 없습니다. 최신 서비스 팩 및 최신 누적 업데이트에 대한 자세한 내용은 다음 문서의 표 1을 참조하세요.
SQL Server 및 해당 구성 요소의 버전, 버전 및 업데이트 수준을 확인하는 방법
해결 방법
이 문제를 해결하려면 아래 단계를 수행합니다.
쿼리 데이터 저장소의 크기를 늘입니다. 이렇게 하면 쿼리 데이터 저장소가 계획을 지우고 운영 모드로 전환
READ_ONLY
되는 빈도 또는 가능성이 줄어듭니다.오류 처리를 코드에 추가하여 오류 556을 catch한 다음 쿼리를
INSERT EXEC
다시 제출합니다.쿼리 데이터 저장소가 .에서 상태로 반환되는 경우 프로시저 캐시를
READ_WRITE
READ_ONLY
지웁다.
추가 정보
Microsoft SQL Server 2017의 쿼리 데이터 저장소가 변경되었기 때문에 SQL Server 2017에서는 이 문제가 발생하지 않습니다.